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

results matching ""

    No results matching ""