Heim  >  Artikel  >  PHP-Framework  >  Warum hat Swoole von Anfang an aufgegeben?

Warum hat Swoole von Anfang an aufgegeben?

coldplay.xixi
coldplay.xixinach vorne
2020-12-09 17:37:263631Durchsuche

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();
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;

2.拓展:php的四种回调

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

$object = new A();
$server->on('Request', array($object, 'test'));
小技巧:查看开启的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();
    🎜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();
    🎜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");
            }
      🎜🎜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";
        }
    }
      🎜🎜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";
        }
    }
      🎜🎜 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!

    Stellungnahme:
    Dieser Artikel ist reproduziert unter:csdn.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen