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