swoole第一次使用后的记录

swoole:php的一个扩展,C语言编写。带给了php新的特性,增加了php在web开发中的地位。

swoole实现了php的与客户端的长连接。支持ftp、udp、http、websocket等传输协议。即可以作为服务端,也可以作为客户端,这是面向事件的编程方式。其中包含消息队列、异步redis,mysql客户端、毫秒定时器等。

简单阐述一下,websocket服务端和前端的通讯事例

//websocket服务类
$serv = new \swoole_websocket_server ("0.0.0.0", 9501);


$serv->set(    
    'worker_num' => 8,//设置启动的Worker进程数
    'max_request' => 10000,//设置worker进程的最大任务数
    'dispatch_mode' => 2,//固定模式
    'task_worker_num' => 8,//配置Task进程的数量
    'heartbeat_check_interval' => 20 * 60,//二十分钟检查一次
    'heartbeat_idle_time' => 20 * 30,//半个小时没有聊天的,断开连接
);

$serv->start();

以上就打开了websocket的服务。

$serv = new \swoole_websocket_server ("0.0.0.0", 9501);      监听本机的9501端口,并且接受任意ip发送的信息

$ser->set(); 给服务器添加配置,swoole有很多配置,这是我选的,你可以根据自己情况自己配置

 $serv->start(); 服务开启。

 通过上诉代码,服务就开启了。要注意的是,端口不能被其他程序占用。还有如果客户端使用websocket链接服务器,最好使用

swoole_websocket_server类开启服务。因为swoole_server类默认使用ftp协议,而websocket是基于http去握手的。会连接不上

接下来是添加事件回调函数,根据自己的配置,添加回调函数、

    $serv->on('Start', ['action\callbacks','onStart']);//开启主线程回调方法
    $serv->on('Open', ['action\callbacks','onOpen']);//服务端和客户端连接回调方法
    $serv->on('WorkerStart', ['action\callbacks','onWorkerStart']);//work进程开始回调方法=====定时任务写在这里
    $serv->on('Message', ['action\callbacks','onMessage']);//收到信息后的回调方法
    $serv->on('Task', ['action\callbacks','onTask']);//收到信息后的回调方法
    $serv->on('Finish', ['action\callbacks','onFinish']);//收到信息后的回调方法
    $serv->on('Close', ['action\callbacks','onClose']);//收到信息后的回调方法

class onClose{
    public static function onStart(){}

    /**
     * @function 当WebSocket客户端与服务器建立连接并完成握手后会回调此函数
     * @param $svr object swoole对象
     * @param $req object Http请求对象
     * @return
     */
    public static function onOpen( $svr, $req){}

    /**
     * @function work进程开启的回调函数
     * @param $serv object swoole对象
     * @param $wid  int 进程号
     * @return
     */
    public static function onWorkerStart($serv,$wid){ }


    /**
     * @function 接受信息后的回调函数
     * @param $serv object swoole对象
     * @param $frame  object swoole_websocket_frame对象
     * @return
     */
   public static function onMessage($serv, $frame)
    {
        $serv->push($frame->fd,"您的信息已收到");
    }

    public static function onTask(){}

    /**
     * 关闭的时候清理,连接池。
     * @param $ser
     * @param $fd
     * @param $reactorId
     */
    public static function onClose( $ser,  $fd, $reactorId){}

    public static function onFinish(){}
}

这里注册了回调函数。  

Start、Open、WorkerStart、Message、Close四个事件的回调函数,是必须注册的。Task、Finish事件,因为配置了task_worker_num,也必须注册。

注册事件回调函数的时候,可以写函数名称,匿名函数,类静态方法.

 Start事件是在使用 $serv->start();开启服务后触发

 WorkerStart事件在服务开启后,程序建立work进程,建立的进程数与配置有关。每建立一条work进程,调用一次回调函数。定时器不能写在Start事件的回调函数中。要写在WorkerStart事件回调函数中,在建立第一条work进程是,添加定时器。定时器才会生效。

顺便说一句:swoole_server->after(int $after_time_ms, mixed $callback_function)方法,swoole_server::after函数本来都是一次性定时器(即定时使用一次后,自动销毁定时器),但是我用的swoole1.9,这个方法或者函数。在执行过一次后并没有销毁。

 Open事件回调函数是当客服端与服务端连接时触发。

Message事件回调函数是在客户端推送信息后触发。第一个参数是swoole对象,第二个参数包含fd文件描述符,及data客户端发送的数据 

Close事件回调函数是在关闭连接后触发。关闭连接分为服务端调用$serv->close()方法主动断开连接,和客服端断开连接。可以根据$reactorId == -1 判断是服务端主动的关闭。 

 Task事件回调函数,是在建立task_worker进程后调用。

 Finish事件回调函数,是在整个程序正常关闭后触发。kill调进程,及ctrl+c都不会让程序触发该事件。

 $serv->push( $fd , $mess )方法是推送给指定客户端信息。$serv->close( $fd )关闭客户端。这两个方法也是很常用的

综上所述,搭配前端WebSocket的onopen,onmessage,send方法。就可以做到简单的收发信息。

最后: https://wiki.swoole.com/wiki/index/prid-1 几乎包含swoole所有的功能及介绍。

展开阅读全文

没有更多推荐了,返回首页