美文网首页
监控文件更新并自动reload workerman

监控文件更新并自动reload workerman

作者: APHOME_明 | 来源:发表于2018-06-05 13:45 被阅读0次
    路径:Applications/FileMonitor/start.php
    <?php
    use Workerman\Worker;
    use Workerman\Lib\Timer;
    // watch Applications catalogue
    $monitor_dir = realpath(__DIR__.'/..');
    // worker
    $worker = new Worker();
    $worker->name = 'FileMonitor';
    $worker->reloadable = false;
    $last_mtime = time();
    $worker->onWorkerStart = function()
    {
        global $monitor_dir;
        // watch files only in daemon mode
        if(!Worker::$daemonize)
        {
            // chek mtime of files per second 
            Timer::add(1, 'check_files_change', array($monitor_dir));
        }
    };
    // check files func
    function check_files_change($monitor_dir)
    {
        global $last_mtime;
        // recursive traversal directory
        $dir_iterator = new RecursiveDirectoryIterator($monitor_dir);
        $iterator = new RecursiveIteratorIterator($dir_iterator);
        foreach ($iterator as $file)
        {
            // only check php files
            if(pathinfo($file, PATHINFO_EXTENSION) != 'php')
            {
                continue;
            }
            // check mtime
            if($last_mtime < $file->getMTime())
            {
                echo $file." update and reload\n";
                // send SIGUSR1 signal to master process for reload
                posix_kill(posix_getppid(), SIGUSR1);
                $last_mtime = $file->getMTime();
                break;
            }
        }
    }
    

    直接将Applications下的FileMonitor目录拷贝到你自己的Applications目录下,重启workerman即可

    # workerman-filemonitor
    
    监控文件更新并自动reload workerman。默认只监控Applications目录,如果要监控其它目录,请更改Applications/FileMonitor/start.php中$monitor_dir,路径最好使用绝对路径。
    
    # 注意
    
    只能更新onXXX中加载的文件,启动脚本直接加载的文件和代码无法自动更新
    
    只有在debug模式启动后才有效,daemon模式不生效。
    
    

    更改代码后不生效

    原因:

    Workerman是常驻内存运行的,常驻内存可以避免重复读取磁盘、重复解释编译PHP,以便达到最高性能。所以更改业务代码后需要手动reload或者restart才能生效。

    同时workerman提供一个监控文件更新的服务,该服务检测到有文件更新后会自动运行reload,从新载入PHP文件。开发者将其放入到项目中随着项目启动即可。

    注意:windows系统不支持reload,无法使用监控服务

    文件监控服务下载地址:

    1、无依赖版本:https://github.com/walkor/workerman-filemonitor

    2、依赖inotify版本:https://github.com/walkor/workerman-filemonitor-inotify

    两个版本区别:

    地址1版本使用的是每秒轮询文件更新时间的方法判断文件是否更新,

    地址2利用Linux内核inotify机制,文件更新时系统会主动通知workerman。

    一般使用地址1无依赖版本即可

    相关文章

      网友评论

          本文标题:监控文件更新并自动reload workerman

          本文链接:https://www.haomeiwen.com/subject/mgvpsftx.html