workerman-filemonitor只能用于linux,但是我們平時(shí)開發(fā)都是用的windows?;趙orkerman-filemonitor二次修改,可完美實(shí)現(xiàn)windwos開發(fā)時(shí)的代碼熱更新。
經(jīng)過測(cè)試,windows下不能直接在filemonitor啟動(dòng)的進(jìn)程中獲取我們需要的父進(jìn)程,所以需要在你啟動(dòng)的gateway文件中添加如下代碼(該代碼一定要放在Worker::runAll()之前)
require_once __DIR__ . '/FileMonitor.php';
new FileMonitor($web, 'www', 5);
FileMonitor.php
<?php
use \Workerman\Worker;
use \Workerman\Lib\Timer;
/**
* workerman-filemonitor for windows
*
* 監(jiān)控文件更新并自動(dòng)reload workerman
*
* 使用方法:
* require_once __DIR__ . '/FileMonitor.php';
* new FileMonitor($worker, $dir, $timer);
*/
class FileMonitor
{
//待監(jiān)聽的項(xiàng)目目錄
private $_monitor_dir = '';
//熱更新間隔時(shí)間,默認(rèn)3s
private $_interval = 0;
//最后一次同步時(shí)間
private $_last_time = 0;
function __construct ($worker, $dir, $timer = 3)
{
// watch Applications catalogue
$this->_monitor_dir = __DIR__ .'/'. $dir;
$this->_interval = $timer;
$this->_last_time = time();
// Emitted when data received
$worker->reloadable = false;
// Emitted when data received
$worker->onWorkerStart = function()
{
// watch files only in daemon mode
if (Worker::$daemonize === false)
{
// chek mtime of files per second
Timer::add($this->_interval, [$this, 'monitor']);
}
};
}
//監(jiān)聽器,kill進(jìn)程
public function monitor ()
{
// recursive traversal directory
$iterator = new RecursiveDirectoryIterator($this->_monitor_dir);
$iterator = new RecursiveIteratorIterator($iterator);
foreach ($iterator as $file)
{
// only check php files
if (pathinfo($file, PATHINFO_EXTENSION) != 'php') continue;
// check mtime
if ($this->_last_time < $file->getMTime())
{
exec('taskkill -f -pid '. getmypid());
$this->_last_time = $file->getMTime();
return true;
}
}
}
}
太感謝了,正需要呢就來了