业务背景
做的是一款游戏匹配的 App,PHP 使用 swoole 创建 websocket 提供游戏的匹配服务
匹配流程如下
- 对匹配者的鉴权 (握手事件处理)
- 匹配的业务逻辑 (比如男只能匹配到女,这块也是需要热更新,open 事件处理)
- 匹配成功返回数据,关闭连接
- 再往后就是 nodejs 去提供服务
想要达到的目的
在不重启服务的情况下,改变了匹配的业务逻辑代码的情况下自动热更新代码
关于热更新 swoole 官方文档
其实核心就是说你要热更新的代码必须在 onWorkerStart 事件中引入
安装 swoole 和 inotify
自己绘制的 "设计图"
如果你使用 artisan 启动 swoole 服务的话,可能会热更新失败,因为在 onWorkerStart, 之前已经载入太多类
index
设置常量同时实例化 MatchServer 来启动服务
require 'MatchServer.php';
if (php_sapi_name() != 'cli') die('请用cli模式启动');
define('ROOT_PATH',dirname(dirname(dirname(__DIR__))).'/');
define('PORT',20005);
$server = new MatchServer();
MatchServer
class MatchServer{
private $server;
protected $application;
function __construct ()
{
// 创建swoole_table,用于进程间数据共享
$table = new swoole_table(1024);
$table->column('fd', swoole_table::TYPE_INT);
$table->column('uid', swoole_table::TYPE_INT);
$table->column('gameType', swoole_table: