File-Watcher 組件
用于在 EasySwoole
中實現熱重啟,讓開發變得更簡便。
組件要求
- easyswoole/spl: ^1.3
- easyswoole/component: ^2.2
安裝方法
composer require easyswoole/file-watcher
倉庫地址
WatchRule
監控目錄:
$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規則數組的文件。 type為SCAN_TYPE_IGNORE_SUFFIX時,會忽略掉后綴在suffix規則數組的文件。
FileWatcher
設置監控程序:
$fileWatcher = new \EasySwoole\FileWatcher\FileWatcher();
$fileWatcher->setScannerDriver(\EasySwoole\FileWatcher\Scanner\Inotify::class);
$fileWatcher->setScannerDriver(\EasySwoole\FileWatcher\Scanner\FileScanner::class);
二選一 不調用此方法 存在inotify擴展默認為Inotify::class反之FileScanner::class
增加監控規則:
/**@var \EasySwoole\FileWatcher\FileWatcher $fileWatcher **/
$fileWatcher->addRule(new \EasySwoole\FileWatcher\WatchRule(__DIR__));
$fileWatcher->addRule(new \EasySwoole\FileWatcher\WatchRule(EASYSWOOLE_ROOT. '/App'));
可進行多次調用 對不同目錄設置不同的規則
設置異常回調:
/**@var \EasySwoole\FileWatcher\FileWatcher $fileWatcher **/
$fileWatcher->setOnException(function (\Throwable $throwable){
});
設置檢測周期(默認1000ms):
/**@var \EasySwoole\FileWatcher\FileWatcher $fileWatcher **/
$fileWatcher->setCheckInterval(1000);
設置觸發回調(文件有變化):
/**@var \EasySwoole\FileWatcher\FileWatcher $fileWatcher **/
$fileWatcher->setOnChange(function (array $list, \EasySwoole\FileWatcher\WatchRule $rule){
// list為變化的文件列表
});
啟動(swoole服務中使用):
/**@var \EasySwoole\FileWatcher\FileWatcher $fileWatcher **/
/**@var \Swoole\Server $server **/
$fileWatcher->attachServer($server);
EasySwoole 中用于熱重啟
例如在 EasySwoole
開發模式中,我們希望當有代碼變動的時候,實現 Server
重啟,只需要在 EasySwoole
的全局事件 EasySwooleEvent
中注冊一下即可實現。 示例代碼如下:
<?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"); // 設置監控規則和監控目錄
$watcher->addRule($rule);
$watcher->setOnChange(function () {
Logger::getInstance()->info('file change ,reload!!!');
ServerManager::getInstance()->getSwooleServer()->reload();
});
$watcher->attachServer(ServerManager::getInstance()->getSwooleServer());
}
}
注意,reload
僅僅針對 Worker進程
加載的代碼有效。