Socket框架
框架提供PSR-4规范的类加载器,同样swoole、workerman也支持同样的加载方式,所以框架和swoole、workerman配合恰到好处,与此同时,框架还解决了经典的MYSQL 8小时无操作导致的MySQL server has gone away问题,在onMessage方法下调用 kali::run() 方法即可实现MVC调度模式,用MVC模式去写Websocket逻辑,爽到飞起。
Workerman 原生方式 Websocket
// 注意:请一定一定不要在外围操作db和cache
use Workerman\Worker;
use kaliphp\kali;
require_once __DIR__ . '/../../../vendor/autoload.php';
// app path
define('APPPATH', __DIR__ . '/../../../www/app');
// websocket服务端
$worker = new Worker("websocket://0.0.0.0:9527");
// 启动4个进程对外提供服务
$worker->count = 4;
$worker->onWorkerStart = function($worker)
{
// 框架注册
kali::registry();
};
$worker->onConnect = function($connection) use ($worker)
{
//Worker::log("workerID:{$worker->id} connectionID:{$connection->id} connected");
$connection->onWebSocketConnect = function($connection, $http_header) use ($worker)
{
/**
* 客户端websocket握手时的回调onWebSocketConnect
* 在onWebSocketConnect回调中获得nginx通过http头中的X_REAL_IP值
*/
$connection->realIP = $_SERVER['HTTP_X_REAL_IP'] ?? $connection->getRemoteIp();
};
};
// 当收到客户端发来的数据后返回hello $data给客户端
$worker->onMessage = function($connection, $data) use ($worker)
{
// 接收到客户端心跳包
if ($data == '~H#C~')
{
// 回复一个心跳包
$connection->send('~H#S~');
return;
}
$data = @json_decode($data, true);
// 判断是否存在控制器和方法
if (!$data || empty($data['ct']) || empty($data['ac']))
{
return;
}
// 运行MVC框架
kali::run($data);
};
$worker->onClose = function($connection) use ($worker)
{
Worker::log("connection closed from ip " . $connection->realIP);
};
// 运行worker
Worker::runAll();Workerman Gateway方式 Websocket
Last updated
Was this helpful?