Swoole简介( 二 )

  • 当TCP的三次握手成功了以后,由这个Reactor线程将连接成功的消息告诉Manager进程,再由Manager进程转交给Worker进程 。
  • 在这个Worker进程中触发了OnConnect的方法 。
  • 当Client向Server发送了一个数据包的时候,首先收到数据包的是Reactor线程,同时Reactor线程会完成组包,再将组好的包交给Manager进程,由Manager进程转交给Worker 。
  • 此时Worker进程触发OnReceive事件 。
  • 如果在Worker进程中做了什么处理,然后再用Send方法将数据发回给客户端时,数据则会沿着这个路径逆流而上 。
  • Swoole进程/线程结构图:
    Swoole简介

    文章插图
     
    现在,我们基于上面的例子修改代码,来看看一个简单的多进程Swoole Server的几个基本配置:
    PHP5.5或更高版本PHP7.0.13或更高版本reactor_num:表示Master进程中,Reactor线程总共开多少个,注意,这个可不是越多越好,因为计算机的CPU是有限的,所以一般设置为与CPU核心数量相同,或者两倍即可 。
    worker_num:表示启动多少个Worker进程,同样,Worker进程数量不是越多越好,仍然设置为与CPU核心数量相同,或者两倍即可 。
    我们可以在Shell里运行,使用pstree查看进程模型结构:
    php swoole_tcp_server.phppstree -ap|grep swoole_tcp | | `-php,2505 swoole_tcp_server.php | | |-php,2507 swoole_tcp_server.php | | | |-php,2510 swoole_tcp_server.php | | | |-php,2511 swoole_tcp_server.php | | | |-php,2512 swoole_tcp_server.php | | | `-php,2513 swoole_tcp_server.php回调函数
    Swoole作为Server时,回调函数有很多 。但可以简单分个类:
    1) 进程启动时执行的:onStart、onManagerStart、onWorkerStart;onWorkerStop、onManagerStop、onShutdown;onWorkerError
    2) 客户端交互时触发的:onReceive/onRequest/onPacket/onMessage、onOpen/onConnect、onClose
    3) Task:onTask、onFinish
    4) Timer:onTimer
    事件执行顺序:
    • 所有事件回调均在$server->start后发生
    • 服务器关闭程序终止时最后一次事件是onShutdown
    • 服务器启动成功后,onStart/onManagerStart/onWorkerStart会在不同的进程内并发执行 。
    • onReceive/onConnect/onClose/onTimer在worker进程(包括task进程)中各自触发
    • worker/task进程启动/结束时会分别调用onWorkerStart/onWorkerStop
    • onTask事件仅在task进程中发生
    • onFinish事件仅在worker进程中发生
    • onStart/onManagerStart/onWorkerStart 3个事件的执行顺序是不确定的
    • UDP协议下只有onReceive事件,没有onConnect/onClose事件
    • 如果未设置onPacket回调函数,收到UDP数据包默认会回调onReceive函数
    • onOpen事件回调是可选的:当WebSocket客户端与服务器建立连接并完成握手后会回调此函数
    实际使用的时候不是所有回调都可以使用的,例如UDP服务器没有onConnect/onClose;例如接收数据,在WebSocket里使用onReceive,在HttpServer使用onRequest,在UDPServer使用onPacket 。
    示例:
    <?php$server = new swoole_server("127.0.0.1",8088);$server->set(array( 'daemonize' => false, 'reactor_num' => 2, 'worker_num' => 4));$server->on('connect', function ($serv, $fd){echo "client connect. fd is {$fd}n";});$server->on('receive', function ($serv, $fd, $from_id, $data){ echo "client connect. fd is {$fd}n";});$server->on('close', function ($serv, $fd){ echo "client close. fd is {$fd}n";});// 以下回调发生在Master进程$server->on("start", function (swoole_server $server){ echo "On master start.n";});$server->on('shutdown', function (swoole_server $server){ echo "On master shutdown.n";});// 以下回调发生在Manager进程$server->on('ManagerStart', function (swoole_server $server){ echo "On manager start.n";});$server->on('ManagerStop', function (swoole_server $server){ echo "On manager stop.n";});// 以下回调也发生在Worker进程$server->on('WorkerStart', function (swoole_server $server, $worker_id){ echo "Worker startn";});$server->on('WorkerStop', function(swoole_server $server, $worker_id){ echo "Worker stopn";});$server->on('WorkerError', function(swoole_server $server, $worker_id, $worker_pid, $exit_code){ echo "Worker errorn";});$server -> start();编程须知