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所有的功能及介绍。