监听的文件夹里删除文件没有热重启 ,这个应该怎么解决
刚刚追了一下walkor的源码, 发现校验文件热重启的逻辑只是对比了一下文件的最后更新时间, 这个并不包括 文件的新增, 改名, 删除等逻辑, 如果要想实现相应的逻辑, 需要自行调整代码
public function checkFilesChange($monitorDir): bool { static $lastMtime, $tooManyFilesCheck; if (!$lastMtime) { $lastMtime = time(); } clearstatcache(); if (!is_dir($monitorDir)) { if (!is_file($monitorDir)) { return false; } $iterator = [new SplFileInfo($monitorDir)]; } else { // recursive traversal directory $dirIterator = new RecursiveDirectoryIterator($monitorDir, FilesystemIterator::SKIP_DOTS | FilesystemIterator::FOLLOW_SYMLINKS); $iterator = new RecursiveIteratorIterator($dirIterator); } $count = 0; foreach ($iterator as $file) { $count ++; /** var SplFileInfo $file */ if (is_dir($file->getRealPath())) { continue; } // check mtime 主要这里校验了最后一次更新的时间 if (in_array($file->getExtension(), $this->extensions, true) && $lastMtime < $file->getMTime()) { $lastMtime = $file->getMTime(); if (DIRECTORY_SEPARATOR === '/' && isset($this->loadedFiles[$file->getRealPath()])) { echo "$file updated but cannot be reloaded because only auto-loaded files support reload.\n"; continue; } $var = 0; exec('"'.PHP_BINARY . '" -l ' . $file, $out, $var); if ($var) { continue; } echo $file . " updated and reload\n"; // send SIGUSR1 signal to master process for reload if (DIRECTORY_SEPARATOR === '/') { posix_kill(posix_getppid(), SIGUSR1); } else { return true; } break; } } if (!$tooManyFilesCheck && $count > 1000) { echo "Monitor: There are too many files ($count files) in $monitorDir which makes file monitoring very slow\n"; $tooManyFilesCheck = 1; } return false; }
OK 就怕后面升级 会覆盖这个文件
这个文件改动频率很小, 如果害怕升级影响到这个文件, 可以自行继承一下这个文件或者重命名一份文件, 然后在config/process.php 调整的你的监控 handler就可以了 app\process\Monitor::class,
config/process.php
app\process\Monitor::class,
是个不错的想法 等下试试
3q
刚刚追了一下walkor的源码, 发现校验文件热重启的逻辑只是对比了一下文件的最后更新时间, 这个并不包括 文件的新增, 改名, 删除等逻辑, 如果要想实现相应的逻辑, 需要自行调整代码
OK 就怕后面升级 会覆盖这个文件
这个文件改动频率很小, 如果害怕升级影响到这个文件, 可以自行继承一下这个文件或者重命名一份文件, 然后在
config/process.php
调整的你的监控 handler就可以了app\process\Monitor::class,
是个不错的想法 等下试试
3q