onConnect
有新的连接进入时,在worker进程中回调。函数原型:
function onConnect(swoole_server $server, int $fd, int $from_id);
- $server是swoole的资源对象
- $fd是连接的文件描述符,发送数据/关闭连接时需要此参数
- $from_id来自那个Reactor线程
例子:
$serv = new swoole_server("127.0.0.1", 9501); $serv->set(array( 'worker_num' => 8, //工作进程数量 'daemonize' => true, //是否作为守护进程 )); $serv->on('connect', function ($serv, $fd){ echo "Client:Connect.\n"; }); $serv->on('receive', function ($serv, $fd, $from_id, $data) { $serv->send($fd, 'Swoole: '.$data); $serv->close($fd); }); $serv->on('close', function ($serv, $fd) { echo "Client: Close.\n"; }); $serv->start();
- 关于$fd和$from_id详细的解释
- onConnect/onClose这2个回调发生在worker进程内,而不是主进程。
- UDP协议下只有onReceive事件,没有onConnect/onClose事件
dispatch_mode = 1/3
在1.7.15以上版本中,当设置dispatch_mode =1/3时会自动去掉onConnect/onClose事件回调。原因是:
- 在此模式下onConnect/onReceive/onClose可能会被投递到不同的进程。连接相关的PHP对象数据,无法实现在onConnect回调初始化数据,onClose清理数据
- onConnect/onReceive/onClose 3种事件可能会并发执行,可能会带来异常