Heim > PHP-Framework > Swoole > Hauptteil

Warum hat Swoole von Anfang an aufgegeben?

coldplay.xixi
Freigeben: 2020-12-09 17:37:26
nach vorne
3640 Leute haben es durchsucht

Swoole-TutorialStellt vor, warum vom Anfang bis zum Aufgeben

Warum hat Swoole von Anfang an aufgegeben?

Empfohlen (kostenlos): Swoole-Tutorial

1. Installation des Swoole-Quellpakets

  1. Laden Sie den Swoole-Quellcode herunter: git clone https: //gitee.com/swoole/swoole.git
  2. git clone https://gitee.com/swoole/swoole.git
  3. 通过phpize(扩展php扩展模块,建立php外挂模块):

    • cd swoole
    • 执行:your/phpize/path
    • ./configure --with-php-config=your/php/path/bin/php-config
    • make && make install
  4. 可以看到swoole.so的位置

    • 我的位置是:/opt/soft/php/lib/php/extensions/no-debug-non-zts-20170718/
  5. 配置php.ini

    • 添加extension=swoole.so
  6. 通过php -m命令,可以看到php的扩展模块
  7. 检测swoole安装成功并且php支持swoole

    • cd your/swoole/path/examples/server
    • php echo.php(如果进程被阻塞,则说明成功)
    • netstat -anp | grep 9501(查看swoole开启的端口号)

二、网络通信引擎

学习swoole需要去翻阅文档,  swoole文档

1.通过swoole创建一个最简单的tcp服务

tcp服务端(tcp_server.php)
//创建Server对象,监听 127.0.0.1:9501端口
$serv = new swoole_server("127.0.0.1", 9501);

$serv->set([
    'worker_num' => 4, // worker进程数,cpu 1-4倍
    'max_request' => 100,
]);

/**
 * 监听连接进入事件
 * $fd 客户端连接服务端的唯一标识
 * $reactor_id 线程id
 */
$serv->on('connect', function ($serv, $fd, $reactor_id) {
    echo "Client: {$fd} - {$reactor_id} - Connect.\n";
});

//监听数据接收事件
$serv->on('receive', function ($serv, $fd, $reactor_id, $data) {
    $serv->send($fd, "Server: ".$data);
});

//监听连接关闭事件
$serv->on('close', function ($serv, $fd) {
    echo "Client: Close.\n";
});

//启动服务器
$serv->start();
Nach dem Login kopieren
tcp客户端(tcp_client.php)
// 创建tcp客户端
$client = new swoole_client(SWOOLE_SOCK_TCP);

// 连接tcp服务端
if (!$client->connect("127.0.0.1", 9501)) {
    echo '连接失败';
    exit;
}

// php cli
fwrite(STDOUT, '请输入:');
$msg = trim(fgets(STDIN));

// 发送消息给tcp服务端
if (!$client->send($msg)) {
    echo '发送消息失败';
    exit;
}

// 接收
$result = $client->recv();
echo $result;
Nach dem Login kopieren

2.拓展:php的四种回调

  • 匿名函数
$server->on('Request', function ($req, $resp) {
    echo "hello world";
});
Nach dem Login kopieren
  • 类静态方法
class A
{
    static function test($req, $resp)
    {
        echo "hello world";
    }
}
$server->on('Request', 'A::Test');
$server->on('Request', array('A', 'Test'));
Nach dem Login kopieren
  • 函数
function my_onRequest($req, $resp)
{
    echo "hello world";
}
$server->on('Request', 'my_onRequest');
Nach dem Login kopieren
  • 对象方法
class A
{
    function test($req, $resp)
    {
        echo "hello world";
    }
}

$object = new A();
$server->on('Request', array($object, 'test'));
Nach dem Login kopieren
小技巧:查看开启的worker进程:  ps aft | grep tcp_server.php
Über phpize (PHP-Erweiterungsmodul erweitern, PHP-Plug-in-Modul erstellen):

    cd swoole

    Ausführen: your/phpize/path
    ./configure --with-php-config=your/php/path/bin/php -config code>

    make && make install


Sie können den Speicherort von swoole.so sehen

    Mein Standort ist: /opt/soft/php/lib/php/extensions/no-debug-non-zts-20170718/
    Konfigurieren Sie PHP .ini
    Fügen Sie extension=swoole.so hinzu
    Sie können das PHP-Erweiterungsmodul über php -m sehen. code> command<h3></h3>Überprüfen Sie, ob Swoole erfolgreich installiert wurde und PHP Swoole unterstützt.<hr> <ul> <h3><code>cd your/swoole/path/examples/server php echo.php(Wenn der Prozess blockiert ist, bedeutet dies Erfolg)
    netstat -anp | 9501 (Überprüfen Sie die von swoole geöffnete Portnummer)2. Netzwerkkommunikations-Engine
    Um Swoole zu lernen, müssen Sie die Dokumente lesen. Swoole-Dokument1. Erstellen Sie den einfachsten TCP-Dienst über Swoole
    🎜TCP-Server (tcp_server.php)🎜
    // 监听所有地址和9501端口
    $http = new swoole_http_server('0.0.0.0', 9501);
    
    // 动静分离配置
    $http->set([
        // 开启静态请求
        'enable_static_handler' => true,
        // 静态资源目录
        'document_root' => '/opt/app/code1/',
    ]);
    
    $http->on('request', function ($request, $response) {
        // 获取get请求的参数
        $param = json_encode($request->get);
        // 设置cookie
        $response->cookie('name', 'ronaldo', time() + 1800);
        // 输出到页面
        $response->end("<h1>Hello Swoole - {$param}</h1>");
    });
    
    // 开启http服务
    $http->start();
    Nach dem Login kopieren
    🎜tcp-Client (tcp_client.php)🎜
    // 监听所有地址和9502端口
    $server = new swoole_websocket_server('0.0.0.0', 9502);
    
    // 动静分离配置
    $server->set([
        // 开启静态请求
        'enable_static_handler' => true,
        // 静态资源目录
        'document_root' => '/opt/app/swoole/websocket',
    ]);
    $server->on('open', function ($server, $request) {
        echo "server:handshake success with fd - {$request->fd}\n";
    });
    
    $server->on('message', function ($server, $frame) {
        echo "receive from {$frame->fd}:{$frame->data},opcode:{$frame->opcode},fin:{$frame->finish}\n";
        $server->push($frame->fd, "this is server");
    });
    
    $server->on('close', function ($server, $fd) {
        echo "client - {$fd} - close\n";
    });
    
    $server->start();
    Nach dem Login kopieren
    🎜2. Erweiterung: vier Rückrufe von PHP🎜🎜🎜anonym function🎜
    // 创建websocket实例
            var websocketURL = "ws://www.rona1do.top:9502";
            var websocket = new WebSocket(websocketURL);
    
            // 实例化对象的onopen属性
            websocket.onopen = function (ev) {
                websocket.send("hello-websocket");
                console.log("connect-swoole-success");
            }
    
            // 实例化对象的onmessage属性,接收服务端返回的数据
            websocket.onmessage = function (ev) {
                console.log("websockect-server-return-data:" + ev.data);
            }
    
            // close
            websocket.onclose = function (ev) {
                console.log("close");
            }
    Nach dem Login kopieren
      🎜🎜class static method🎜
    class WebSocket {
        const HOST = '0.0.0.0';
        const PORT = 9502;
    
        private $ws = null;
    
        function __construct()
        {
            $this->ws = new swoole_websocket_server(self::HOST, self::PORT);
            $this->ws->on('open', [$this, 'onOpen']);
            $this->ws->on('message', [$this, 'onMessage']);
            $this->ws->on('close', [$this, 'onClose']);
            $this->ws->start();
        }
    
        // 监听websocket连接事件
        function onOpen($server, $request) {
            echo "server: handshake success with fd{$request->fd}\n";
        }
    
        // 监听websocket消息接收事件
        function onMessage($server, $frame) {
            echo "receive from {$frame->fd}:{$frame->data},opcode:{$frame->opcode},fin:{$frame->finish}\n";
            $server->push($frame->fd, "this is server");
        }
    
        // 监听客户端关闭事件
        function onClose($server, $fd) {
            echo "Client:{$fd} closes\n";
        }
    }
    Nach dem Login kopieren
      🎜🎜function🎜
    class Websocket {
    
        const HOST = '0.0.0.0';
        const PORT = 9502;
        private $ws = null;
    
        public function __construct()
        {
            $this->ws = new swoole_websocket_server(self::HOST, self::PORT);
            $this->ws->set([
                'worker_num' => 2,
                'task_worker_num' => 2, // 要想使用task必须要指明
            ]);
            $this->ws->on('open', [$this, 'onOpen']);
            $this->ws->on('message', [$this, 'onMessage']);
            $this->ws->on('task', [$this, 'onTask']);
            $this->ws->on('finish', [$this, 'onFinish']);
            $this->ws->on('close', [$this, 'onClose']);
            $this->ws->start();
        }
    
        public function onOpen($server, $request)
        {
            echo "server:handshake success with fd:{$request->fd}\n";
        }
    
        public function onMessage($server, $frame)
        {
            echo "receive from {$frame->fd}:{$frame->data}\n";
    
            // 需要投递的任务数据
            $data = [
                'fd' => $frame->fd,
                'msg' => 'task',
            ];
            $server->task($data);
    
            $server->push($frame->fd, 'this is server');
        }
    
        // 处理投递的任务方法,非阻塞
        public function onTask($server, $task_id, $worker_id, $data)
        {
            print_r($data);
            // 模拟大量数据的操作
            sleep(10);
            return "task_finish";
        }
        
        // 投递任务处理完毕调用的方法
        public function onFinish($server, $task_id, $data)
        {
            echo "task_id:{$task_id}\n";
            echo "task finish success:{$data}\n";
        }
        
        public function onClose($server, $fd)
        {
            echo "Client:close";
        }
    }
    Nach dem Login kopieren
      🎜🎜 Objektmethode🎜
    rrreee🎜🎜Tipps: 🎜Sehen Sie sich den geöffneten Worker-Prozess an: ps aft |.🎜🎜🎜3. Der Server und der Client können erstellt werden selbst gemäß der Dokumentation🎜🎜🎜4. http-Dienst🎜rrreee🎜🎜5. Erstellen Sie einen Websocket-Dienst über swoole🎜🎜websocket-Server (websocket_server.php)🎜rrreee🎜websocket-Client (websockt_client.html)🎜 rrreee🎜🎜6 . Verwendung Objektorientiert zur Optimierung des WebSocket-Service-Codes🎜rrreee🎜🎜7. Task Small Case in Swoole🎜🎜🎜onTask:🎜 wird innerhalb des task_worker-Prozesses aufgerufen. Der Worker-Prozess kann die Funktion swoole_server_task verwenden, um neue Aufgaben an den task_worker-Prozess zu übermitteln. Wenn der aktuelle Task-Prozess die Rückruffunktion onTask aufruft, wechselt er den Prozessstatus auf „Beschäftigt“ und empfängt keine neuen Aufgaben mehr. Wenn die onTask-Funktion zurückkehrt, wechselt er den Prozessstatus auf „Leerlauf“ und empfängt weiterhin neue Aufgaben. 🎜🎜🎜onFinish: 🎜Wenn die vom Arbeitsprozess gelieferte Aufgabe in task_worker abgeschlossen ist, sendet der Aufgabenprozess das Ergebnis der Aufgabenverarbeitung über die Methode swoole_server->finish() an den Arbeitsprozess. 🎜rrreee

    Das obige ist der detaillierte Inhalt vonWarum hat Swoole von Anfang an aufgegeben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

    Verwandte Etiketten:
    Quelle:csdn.net
    Erklärung dieser Website
    Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
    Beliebte Tutorials
    Mehr>
    Neueste Downloads
    Mehr>
    Web-Effekte
    Quellcode der Website
    Website-Materialien
    Frontend-Vorlage