集成在THinkPHP的ws类同时作为http_server用,接收websocket时不进入onOpen等回调
来源:8-14 赛事直播在线用户处理 - redis方案(基础类库优化)
阿憨阿憨
2018-10-29
集成在THinkPHP的ws类同时作为http_server用,接收websocket时不进入onOpen等回调,同时也不会报错.
public function __construct()
{
//把命名空间形式,改为下面的Zend命名的形式即可,原因未知,打开swoole的track日志也没显示
//$this->ws = new \Swoole\Http\Server(self::HOST, self::PORT);
$this->ws = new swoole_websocket_server(self::HOST, self::PORT);
$this->ws->set([
'enable_static_handler' => true,
//开启静态页面支持
// 'document_root' => '/workspace/imooc_swoole/thinkphp_5.1.0_rc/public/static', //指定静态页面路径
'document_root' => '/Users/liuhao/workspace/myProject/imooc_swoole/thinkphp_5.1.0_rc/public/static',
//指定静态页面路径
'worker_num' => 4,
'task_worker_num' => 4,
'log_level' => SWOOLE_LOG_NOTICE,
]);
//因为websocket是继承自httpServer的所以这里可以直接用websocket来做httpserver
$this->ws->on('open', [$this, 'onOpen']);
$this->ws->on('message', [$this, 'onMessage']);
$this->ws->on('workerstart', [$this, 'onWorkerStart']);
$this->ws->on('request', [$this, 'onRequest']);
//task任务处理的回调
$this->ws->on('task', [$this, 'onTask']);
//task任务处理完毕的回调
$this->ws->on('finish', [$this, 'onFinish']);
//激活连接断开的回调
$this->ws->on('close', [$this, 'onClose']);
//打开服务
$this->ws->start();
}
写回答
2回答
-
阿憨阿憨
提问者
2018-10-30
public function onOpen($ws, $request) { //这里的redis是没问题的 \app\common\lib\Predis::getInstance()->sAdd(config('redis.live_redis_key'), $request->fd); var_dump('客户端' . $request->fd . '开始连接'); }
我把构造函数里的
//原来用命名空间的形式会报错把命名空间形式改为下面的Zend命名的形式就没这个问题了,,打开swoole的track日志也没显示
//$this->ws = new \Swoole\Http\Server(self::HOST, self::PORT);
$this->ws = new swoole_websocket_server(self::HOST, self::PORT);我的版本swoole4.2.3,后来更新到了swoole4.2.5后也没有这个问题了
00 -
singwa
2018-10-30
您好 您回调函数onOpen是如何写的,截图我看看把。
022018-10-30
相似问题