路径: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无依赖版本即可
网友评论