summer项目开发九:热更新

由于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文件中新增

标签: 无

发表评论: