由于swoole是常驻内存,就带来个问题,修改了代码,除非重启服务,否则是不会生效的,开发中会很不方便。
网上搜索了下些解决方案, 最终选择了inotify扩展的方案
inotify
官方文档:https://www.php.net/manual/en/book.inotify.php
安装:
pecl install inotify
为了扩展方便,我把他作为了event扩展
private function inotify(EventInterface $e){
$isWatch = Config::getInstance()->get('tcp.server.watch');
if(!$isWatch){
return false;
}
$watches = Config::getInstance()->get('watch');
if(!$watches){
return false;
}
$server = $e->getParam('server');
$notify = inotify_init();
foreach ($watches as $watch) {
if(!file_exists($watch)){
continue;
}
inotify_add_watch($notify, $watch, IN_CREATE | IN_DELETE | IN_MODIFY);
}
swoole_event_add($notify, function () use ($notify, $server){
inotify_read($notify);
if(!empty($server)){
$server->reload();
}
});
echo "watching files\n";
}
通过命令行参数 -w 触发,
php user/summer tcp:start -w
这样我们就可以修改api或者rpc文件即时生效
目前内置3个目录
- api
- rpc
- beans
需要监听的,可以在app/config目录下watch.php文件中新增