多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
Swoole作为Server时,[回调函数](https://wiki.swoole.com/wiki/page/41.html)有很多。但可以简单分个类: 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 <?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 start\n"; }); $server->on('WorkerStop', function(\swoole_server $server, $worker_id){ echo "Worker stop\n"; }); $server->on('WorkerError', function(\swoole_server $server, $worker_id, $worker_pid, $exit_code){ echo "Worker error\n"; }); $server -> start(); ```