easy swoole集成inotify.so实现服务热更新

本文绝逼是楼主自测通过的,自测都不通过的,是不会发上来害人的

更新:2018-09-02,这篇文章适合easyswoole1.x版本的热更新,2.x版本的请看我的另外一篇文章:https://blog.csdn.net/qq_27517377/article/details/82313001

首先确认已经安装好swoole,没有安装好的同学可以参考:swoole安装

下载easy swoole
随便进入一个目录就行了,创建目录并下载:
make easy && cd easy && curl https://www.easyswoole.com/installer.php | php
启动框架 :php server start
浏览器访问 :http://120.25.226.161:9501/index/index (ip改成你的Ip即可,如果访问ok那安装成功,安装失败请重复上面操作)
如果安装了ab工具的话可以试下性能测试,没安装的同学可以看下我的另外一篇博客,具体的参数都有写的:

ab -n 10000 -c 20 http://120.25.226.161:9501/    我的单核2g主机内网测试4000+的并发

easy swoole是内存框架,就是框架启动的时候就已经加载文件到内存了,启动后的所有修改都需要重启服务器才能生效,在开发阶段,每修改一句话都需要重启服务器,这很明显是不合理的,所以要做热更新
pcel install inotify
然后把扩展加入到php.ini文件,怎么添加,跟swoole一样,飞机票拿走 swoole安装
同理加上去后重启 : kill -USR2 php-fpm 的master 进程
注意的是有的同学的php.ini在fast-cgi 模式和cli模式的是不一样的 :php -i |grep php.ini
php -m |grep swoole
php -m |grep inotify
这两兄弟躺在里面的话,下面就加段代码进去就行了,飞机票: 热更新代码

#可以将以下代码添加到Event.php的onWorkerStart事件中,实现文件更新后自动reload服务,请确定安装了inotify拓展
#提醒: 在生产模式上线前一定要注意移除热重启,否则可能会造成不可预估的错误和异常
//请确定有inotify拓展
if ($workerId == 0) {
    // 递归获取所有目录和文件
    $a = function ($dir) use (&$a) {
        $data = array();
        if (is_dir($dir)) {
            //是目录的话,先增当前目录进去
            $data[] = $dir;
            $files = array_diff(scandir($dir), array('.', '..'));
            foreach ($files as $file) {
                $data = array_merge($data, $a($dir . "/" . $file));
            }
        } else {
            $data[] = $dir;
        }
        return $data;
    };
    $list = $a(ROOT . "/App");
    $notify = inotify_init();
    // 为所有目录和文件添加inotify监视
    foreach ($list as $item) {
        inotify_add_watch($notify, $item, IN_CREATE | IN_DELETE | IN_MODIFY);
    }
    // 加入EventLoop
    swoole_event_add($notify, function () use ($notify) {
        $events = inotify_read($notify);
        if (!empty($events)) {
            //注意更新多个文件的间隔时间处理,防止一次更新了10个文件,重启了10次,懒得做了,反正原理在这里
            Server::getInstance()->getServer()->reload();
        }
    });
}

重启服务,这样就实现热更新了,开始你的搬砖旅途吧!!!

你可能感兴趣的:(php)