Swoole Worker启动前执行事件,该回调函数被执行时,已经完成的工作有:
- frameInitialize 回调事件
- swoole_http_server 实例已经创建,且设置了启动参数。(未启动)
添加更多回调事件与混合监听
添加回调事件(监听WEBSOCKET)
例如在开启WS_SUPPORT选项时,需要添加onMessage事件。
$server->on("message",function (\swoole_websocket_server $server, \swoole_websocket_frame $frame){
Logger::console("receive data".$frame->data);
$server->push($frame->fd,"you say ".$frame->data);
});
$server->on("handshake",function (\swoole_http_request $request, \swoole_http_response $response){
Logger::console("handshake");
//自定定握手规则,没有设置则用系统内置的(只支持version:13的)
if (!isset($request->header['sec-websocket-key']))
{
//'Bad protocol implementation: it is not RFC6455.'
$response->end();
return false;
}
if (0 === preg_match('#^[+/0-9A-Za-z]{21}[AQgw]==$#', $request->header['sec-websocket-key'])
|| 16 !== strlen(base64_decode($request->header['sec-websocket-key']))
)
{
//Header Sec-WebSocket-Key is illegal;
$response->end();
return false;
}
$key = base64_encode(sha1($request->header['sec-websocket-key']
. '258EAFA5-E914-47DA-95CA-C5AB0DC85B11',
true));
$headers = array(
'Upgrade' => 'websocket',
'Connection' => 'Upgrade',
'Sec-WebSocket-Accept' => $key,
'Sec-WebSocket-Version' => '13',
'KeepAlive' => 'off',
);
foreach ($headers as $key => $val)
{
$response->header($key, $val);
}
$response->status(101);
$response->end();
// SwooleHttpServer::getInstance()->getServer()->push($request->fd,"hello world");
});
$server->on("close",function ($ser,$fd){
Logger::console("client {$fd} close");
});
监听TCP连接
例如,在HTTP SERVER中,想同时实现TCP连接以实现实时推送。
$listener = $server->addlistener("0.0.0.0",9502,SWOOLE_TCP);
//混合监听tcp时 要重新设置包解析规则 才不会被HTTP覆盖,且端口不能与HTTP SERVER一致 HTTP本身就是TCP
$listener->set(array(
"open_eof_check"=>false,
"package_max_length"=>2048,
));
$listener->on("connect",function(\swoole_server $server,$fd){
Logger::console("client connect");
});
$listener->on("receive",function(\swoole_server $server,$fd,$from_id,$data){
Logger::console("received connect");
$server->send($fd,"swoole ".$data);
$server->close($fd);
});
$listener->on("close",function (\swoole_server $server,$fd){
Logger::console("client close");
});
监听UDP连接
例如,在HTTP SERVER中,想同时实现UDP连接以实现消息上报收集。
$udp = $server->addlistener("0.0.0.0",9503,SWOOLE_UDP);
//udp 请勿用receive事件
$udp->on('packet',function(\swoole_server $server, $data,$clientInfo){
var_dump($data);
});
添加Event Loop事件
$listener = stream_socket_server(
"udp://0.0.0.0:9504",
$error,
$errMsg,
STREAM_SERVER_BIND
);
if($errMsg){
throw new \Exception("cluster server bind error on msg :{$errMsg}");
}else{
//加入event loop
swoole_event_add($listener,function($listener){
$data = stream_socket_recvfrom($listener,9504,0,$client);
var_dump($data);
stream_socket_sendto($listener,"hello",0,$client());
});
}