swoole websocket对象创建
//基类
abstract class Server
{
//把实例存到属性中
public $serv = null;
public function __construct()
{
$this->serv = new \swoole_websocket_server('0.0.0.0',9501);
//设置基本配置
$this->serv->set(array(
//进程个数,一般跟服务器核心数相同
'worker_num' => 4,
//是否开启守护模式
'daemonize' => false,
//Listen队列长度,如backlog => 128,此参数将决定最多同时有多少个等待accept的连接
'backlog' => 128,
// 配置Task进程的数量,配置此参数后将会启用task功能。所以Server务必要注册onTask
'task_worker_num' => 1,
));
// Server启动在主进程的主线程回调此函数
$this->serv->on('start', array($this, 'onStart'));
// 此事件在Worker进程/Task进程启动时发生
$this->serv->on('WorkerStart', array($this, 'onWorkerStart'));
// websocket server的方法
$this->serv->on('open', array($this, 'onOpen'));
$this->serv->on('message', array($this, 'onMessage'));
$this->serv->on('close', array($this, 'onClose'));
// 启动服务
$this->serv->start();
}
/**
* 服务启动回调函数
* @param $server
*/
public function onStart($server)
{
echo 'server 启动';
echo SWOOLE_VERSION."\n";
}
/**
* worker启动回调函数
* @param $server
* @param $worker_id
*/
public function onWorkerStart($server, $worker_id)
{
if($worker_id >= 4){
// 这是一个task进程
echo '这是一个task进程,进程id为'.$worker_id."\n";
} else {
echo 'worker进程:'.$worker_id."\n";
}
}
/**
* 链接关闭回调函数
* @param $server
* @param $fd
*/
public function onClose($server, $fd)
{
// 获取当前客户端连接服务端的端口
$server_port = $this->serv->connection_info($fd)['server_port'];
echo '客户端:'.$fd.'断开了连接'."\n";
}
/**
* websocket 链接进来
* @param \swoole_websocket_server $svr
* @param \swoole_http_request $req
* @return mixed
*/
abstract function onOpen(\swoole_websocket_server $server, \swoole_http_request $req);
abstract function onMessage(\swoole_websocket_server $_server, $frame);
}
关于websocket server的函数
Swoole\WebSocket\Server是Swoole\Server的子类,因此可以调用Swoole\Server的全部方法。
<?php
namespace app\swoole\controller;
use app\swoole\controller\Server;
class Run extends Server
{
// websocket 连接进来
public function onOpen(\swoole_websocket_server $server, \swoole_http_request $req)
{
$connection_info = $server->connection_info($req->fd);
echo '当前连接客户端:'.$req->fd."\n";
echo '当前连接客户端IP:'.$connection_info['remote_ip']."\n";
echo '当前连接端口:'.$connection_info['server_port'];
}
// 接受消息
public function onMessage(\swoole_websocket_server $_server, $frame)
{
$frame = json_decode(json_encode($frame),true);
echo '收到消息:'.$frame['data']."\n";
}
}
websocket 主要是使用3个方法,onOpen,onMessage,onClose 三个回调方法
调用顺序
1.首先会触发onStart事件
2.其次触发onWorkerStart事件,如果进程设置数为4,则会触发4次,如果再有2个task进程,则会触发6次
3.客户端进来后触发onOpen事件
4.客户端发送消息到服务端 触发onMessage事件
5.客户端退出 触发onClose事件