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?