这个应该是swoole2.0时的配置。记不太清楚了。当时是tp6测试版本
今天修改一下
tp6默认是支持socketio的。
但我个人每少使用socketio。以前一直用websocket. 升级到tp6后突然发现自己不会用think-swoole了。也找不到文档。
今天自己看了下源码 整理了一个入门的东西。分享给大家。
先上配置文件
<?php
use think\swoole\websocket\room\TableRoom;
use app\server\Parser;
use app\server\Handler;
return [
'server' => [
'host' => '0.0.0.0', // 监听地址
'port' => 9501, // 监听端口
'mode' => SWOOLE_PROCESS, // 运行模式 默认为SWOOLE_PROCESS
'sock_type' => SWOOLE_SOCK_TCP, // sock type 默认为SWOOLE_SOCK_TCP
'options' => [
'pid_file' => runtime_path() . 'swoole.pid',
'log_file' => runtime_path() . 'swoole.log',
'daemonize' => false,
// Normally this value should be 1~4 times larger according to your cpu cores.
'reactor_num' => swoole_cpu_num(),
'worker_num' => swoole_cpu_num(),
'task_worker_num' => swoole_cpu_num(),
'enable_static_handler' => true,
'document_root' => root_path('public'),
'package_max_length' => 20 * 1024 * 1024,
'buffer_output_size' => 10 * 1024 * 1024,
'socket_buffer_size' => 128 * 1024 * 1024,
'max_request' => 3000,
'send_yield' => true,
],
],
'websocket' => [
'enabled' => true,
'handler' => Handler::class,
'parser' => Parser::class,
'route_file' => base_path() . 'websocket.php',
'ping_interval' => 25000,
'ping_timeout' => 60000,
'room' => [
'type' => TableRoom::class,
'room_rows' => 4096,
'room_size' => 2048,
'client_rows' => 8192,
'client_size' => 2048,
],
],
'auto_reload' => true,
'enable_coroutine' => true,
'resetters' => [],
'tables' => [],
];
重点在websocket这块的配置。1 enabled=>true 启用websocket
2 handler parser 两个配置类。这里默认是使用socketio的。重写这两个类。
上代码 啥也不多说了
<?php
namespace app\server;
use think\App;
use Swoole\WebSocket\Server as WebsocketServer;
use think\Config;
use think\Request;
use Swoole\Websocket\Frame;
use think\swoole\facade\Server;
use think\swoole\websocket\HandlerContract;
class Handler implements HandlerContract{
/** @var WebsocketServer */
protected $server;
/** @var Config */
protected $config;
public function __construct(App $app)
{
$this->server = $app->make(Server::class);
$this->config = $app->config;
}
public function onOpen($fd,Request $request){
//有用户登录时....
return true;
}
/**
* 这里是正常影响客户的send的消息
*
* @param Frame $frame
* @return void
* @author autumu
*/
public function onMessage(Frame $frame){
//p($frame);
$this->server->push($frame->fd,123213123);
return ;
}
public function onClose($fd, $reactorId)
{
p("{$fd}离开了");
return ;
}
}
<?php
namespace app\server;
use Swoole\WebSocket\Frame;
use Swoole\WebSocket\Server;
use think\facade\App;
class Parser extends \think\swoole\websocket\Parser{
/**
* @return boolean
*/
public function execute($server, $frame){
//这里可以做数据过滤 心跳包之类的 true代表结束后续流程
//例如 检测到前端发来的是ping包,这里就可以直接给客户端返回pong 不需要进入后面的流程了
return false;
}
/**
* 目前还不知道在websocket中有什么用
*
* @param string $event
* @param [type] $data
* @return void
* @author autumu
*/
public function encode(string $event, $data)
{
//echo "encode";
}
// 客户端传递消息格式
// {"event":"login","data":{"user":"admin","pwd":"1234"}}
// think\swoole\concerns\InteractsWithWebsocket 中onMessage要使用过,除非自己去修改里面的逻辑
public function decode($frame)
{
$data = json_decode($frame->data,true);
return $data;
}
}
注 : 目前是有规定客户传递数据的格式的。不像以前,自己随便写