webman监听的文件夹里删除文件没有热重启

hot12121212

问题描述

监听的文件夹里删除文件没有热重启 ,这个应该怎么解决

105 1 0
1个回答

qq7467466

刚刚追了一下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;
    }
  • hot12121212 4天前

    OK 就怕后面升级 会覆盖这个文件

  • qq7467466 4天前

    这个文件改动频率很小, 如果害怕升级影响到这个文件, 可以自行继承一下这个文件或者重命名一份文件, 然后在config/process.php 调整的你的监控 handler就可以了 app\process\Monitor::class,

  • hot12121212 4天前

    是个不错的想法 等下试试

🔝