File-Watcher 組件
用于在 EasySwoole
中實現(xiàn)熱重啟,讓開發(fā)變得更簡便。
組件要求
- easyswoole/spl: ^1.3
- easyswoole/component: ^2.2
安裝方法
composer require easyswoole/file-watcher
倉庫地址
WatchRule
監(jiān)控目錄:
$watchRule = new \EasySwoole\FileWatcher\WatchRule(EASYSWOOLE_ROOT."/App");
指定忽略目錄:
/**@var \EasySwoole\FileWatcher\WatchRule $watchRule **/
$watchRule->setIgnorePaths([EASYSWOOLE_ROOT."/App/Api", EASYSWOOLE_ROOT."/App/Admin"]);
指定忽略文件:
/**@var \EasySwoole\FileWatcher\WatchRule $watchRule **/
$watchRule->setIgnoreFiles([EASYSWOOLE_ROOT."/App/Api/Teacher.php", EASYSWOOLE_ROOT."/App/Admin/Teacher.php"]);
指定匹配后綴:
/**@var \EasySwoole\FileWatcher\WatchRule $watchRule **/
$watchRule->setType($watchRule::SCAN_TYPE_SUFFIX_MATCH);
//$watchRule->setType($watchRule::SCAN_TYPE_IGNORE_SUFFIX);
$watchRule->setSuffix(['php']);
type為SCAN_TYPE_SUFFIX_MATCH時,只匹配后綴必須在suffix規(guī)則數(shù)組的文件。 type為SCAN_TYPE_IGNORE_SUFFIX時,會忽略掉后綴在suffix規(guī)則數(shù)組的文件。
FileWatcher
設(shè)置監(jiān)控程序:
$fileWatcher = new \EasySwoole\FileWatcher\FileWatcher();
$fileWatcher->setScannerDriver(\EasySwoole\FileWatcher\Scanner\Inotify::class);
$fileWatcher->setScannerDriver(\EasySwoole\FileWatcher\Scanner\FileScanner::class);
二選一 不調(diào)用此方法 存在inotify擴展默認為Inotify::class反之FileScanner::class
增加監(jiān)控規(guī)則:
/**@var \EasySwoole\FileWatcher\FileWatcher $fileWatcher **/
$fileWatcher->addRule(new \EasySwoole\FileWatcher\WatchRule(__DIR__));
$fileWatcher->addRule(new \EasySwoole\FileWatcher\WatchRule(EASYSWOOLE_ROOT. '/App'));
可進行多次調(diào)用 對不同目錄設(shè)置不同的規(guī)則
設(shè)置異常回調(diào):
/**@var \EasySwoole\FileWatcher\FileWatcher $fileWatcher **/
$fileWatcher->setOnException(function (\Throwable $throwable){
});
設(shè)置檢測周期(默認1000ms):
/**@var \EasySwoole\FileWatcher\FileWatcher $fileWatcher **/
$fileWatcher->setCheckInterval(1000);
設(shè)置觸發(fā)回調(diào)(文件有變化):
/**@var \EasySwoole\FileWatcher\FileWatcher $fileWatcher **/
$fileWatcher->setOnChange(function (array $list, \EasySwoole\FileWatcher\WatchRule $rule){
// list為變化的文件列表
});
啟動(swoole服務(wù)中使用):
/**@var \EasySwoole\FileWatcher\FileWatcher $fileWatcher **/
/**@var \Swoole\Server $server **/
$fileWatcher->attachServer($server);
EasySwoole 中用于熱重啟
例如在 EasySwoole
開發(fā)模式中,我們希望當(dāng)有代碼變動的時候,實現(xiàn) Server
重啟,只需要在 EasySwoole
的全局事件 EasySwooleEvent
中注冊一下即可實現(xiàn)。 示例代碼如下:
<?php
namespace EasySwoole\EasySwoole;
use EasySwoole\EasySwoole\AbstractInterface\Event;
use EasySwoole\EasySwoole\Swoole\EventRegister;
use EasySwoole\FileWatcher\FileWatcher;
use EasySwoole\FileWatcher\WatchRule;
class EasySwooleEvent implements Event
{
public static function initialize()
{
date_default_timezone_set('Asia/Shanghai');
}
public static function mainServerCreate(EventRegister $register)
{
$watcher = new FileWatcher();
$rule = new WatchRule(EASYSWOOLE_ROOT . "/App"); // 設(shè)置監(jiān)控規(guī)則和監(jiān)控目錄
$watcher->addRule($rule);
$watcher->setOnChange(function () {
Logger::getInstance()->info('file change ,reload!!!');
ServerManager::getInstance()->getSwooleServer()->reload();
});
$watcher->attachServer(ServerManager::getInstance()->getSwooleServer());
}
}
注意,reload
僅僅針對 Worker進程
加載的代碼有效。