监控文件更新并自动reload workerman

2018-06-05  本文已影响0人  APHOME_明
路径: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无依赖版本即可

上一篇 下一篇

猜你喜欢

热点阅读