swoole 事件绑定tp6指定控制器
swoole 服务
<?php
// 1. 加载ThinkPHP6的自动加载文件(关键:路径指向项目根目录的vendor)
require __DIR__ . '/../vendor/autoload.php';
// 3. 初始化应用(后续代码不变)
$app = \think\App::getInstance();
$app->initialize();
//创建Server对象,监听 127.0.0.1:9501 端口。
$server = new Swoole\Server('0.0.0.0', 9501);
$server->set([
'daemonize' => false, // 启用守护进程
'log_file' => '/www/wwwroot/www.1000.com/swoole/runtime/swoole.log', // 日志路径
'pid_file' => '/www/wwwroot/www.1000.com/swoole/runtime/swoole.pid', // PID文件路径
// 新增:连接超时配置(避免误断开)
'open_tcp_keepalive' => true, // 开启TCP保活
'tcp_keepidle' => 600, // 10分钟无数据触发保活检测
'tcp_keepinterval' => 30, // 保活检测间隔30秒
'tcp_keepcount' => 5, // 检测5次无响应才断开
]);
// 4. 绑定事件到指定控制器(核心逻辑)
// 假设控制器为:app\controller\SwooleController
// 监听连接进入事件 -> 调用控制器的connect方法
$server->on('Connect', function ($server, $fd) use ($app) {
// 实例化控制器(通过TP容器,支持依赖注入)
$controller = $app->make(\app\index\controller\SwooleTcp::class);
// 调用控制器的connect方法(传递$server和$fd参数)
$controller->connect($server, $fd);
});
// 监听数据接收事件 -> 调用控制器的receive方法
$server->on('Receive', function ($server, $fd, $reactor_id, $data) use ($app) {
$controller = $app->make(\app\index\controller\SwooleTcp::class);
// 调用receive方法(传递完整参数)
$controller->receive($server, $fd, $reactor_id, $data);
});
// 监听连接关闭事件 -> 调用控制器的close方法
$server->on('Close', function ($server, $fd) use ($app) {
$controller = $app->make(\app\index\controller\SwooleTcp::class);
$controller->close($server, $fd);
});
// 启动服务器
$server->start();绑定控制器 app\index\controller\SwooleTcp.php
<?php
namespace app\index\controller;
// 可以引入TP的模型、工具类等
use think\facade\Log;
class SwooleTcp
{
/**
* 处理客户端连接事件
* @param $server Swoole\Server 服务实例
* @param $fd int 客户端连接标识
*/
public function connect($server, $fd)
{
echo "客户端[{$fd}]已连接\n";
// 示例:记录日志(使用TP的Log facade)
Log::info("Client {$fd} connected");
// 可以在这里添加业务逻辑(如初始化用户数据)
}
/**
* 处理客户端消息接收事件
* @param $server Swoole\Server 服务实例
* @param $fd int 客户端连接标识
* @param $reactor_id int 反应堆ID
* @param $data string 接收的数据
*/
public function receive($server, $fd, $reactor_id, $data)
{
echo "收到客户端[{$fd}]的消息:{$data}\n";
// 示例:处理数据并回复
$response = "服务器已收到:{$data}";
$server->send($fd, $response);
// 可以调用模型处理业务(如存入数据库)
// $user = new \app\model\User();
// $user->saveLog($fd, $data);
}
/**
* 处理客户端断开连接事件
* @param $server Swoole\Server 服务实例
* @param $fd int 客户端连接标识
*/
public function close($server, $fd)
{
echo "客户端[{$fd}]已断开\n";
Log::info("Client {$fd} closed");
// 示例:清理客户端相关资源
}
}端口开关命令
lsof -i :9501 #查看端口进程pid
kill -9 pid #指定pid
kill $(lsof -t -i:9501) #终止9501端口所有进程