You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将检测两个目录更新时间的PHP代码扩展为支持任意数量目录

PHP多目录更新检测修改方案

核心修改思路

原代码硬编码了两个目录的遍历逻辑,仅需做少量调整即可支持任意数量目录:

  • 配置区将单目录变量改为目录数组,可自由增删检测目标
  • 替换原有双目录切换的循环逻辑,改为遍历所有配置目录依次处理
  • 原有文件过滤、更新时间计算、统计日志写入逻辑完全复用,无需改动

修改后的完整代码

<?php

/*-----
 CONFIG
------*/
$filestat_path = "/nfs/scarab/.../filestat.txt";
// 改为目录数组,可添加任意数量需要检测的目录
$target_dirs = [
    "/nfs/scarab/...",
    "/nfs/scarab/...",
    // 按需追加更多检测目录即可
    // "/path/to/your/third/dir",
    // "/path/to/your/fourth/dir",
];
/*-----*/


$stats_array = array();
$counter = 1;


if(is_file($filestat_path)) {
    $file_array = file($filestat_path);
    foreach($file_array as $line) {
        // tab delimited timestamp, filename, counter
        $line = trim($line);
        if(!empty($line)) {
            $line_array = explode("\t",$line);
            $stats_array[md5($line_array[1])] = $line_array;
        }
    }
}

$files = array(); // create empty array

// 替换原有双目录处理逻辑,遍历所有目标目录
foreach ($target_dirs as $crdir) {
    $dir = dir($crdir); // 打开当前遍历的目录
    while (($file = $dir->read()) !== false) {
        // 原有文件处理逻辑完全复用
        if($file == '..') continue; // 跳过父级目录
        if($file == '.') continue; // 跳过当前目录
        // if(strpos($file, '.jpg') !== false) continue;
        // if(strpos($file, '.jpeg') !== false) continue;
        // if(strpos($file, '.xml') !== false) continue;
        // if(strpos($file, '.gif') !== false) continue;
        // if(strpos($file, '.png') !== false) continue;
        // if(strpos($file, '.m') !== false) continue;
        // if(strpos($file, '.html') == false) continue; // 仅检测HTML文件可取消注释
        // if(strpos($file, '.txt') !== false) continue;
        if($file == '.htaccess') continue; // 跳过安全配置文件
        if($file == 'filestat.txt') continue; // 跳过统计日志文件
        $file = $crdir . '/' . $file;
        if(is_dir($file)) continue; // 跳过子目录
        if(!file_exists($file)) continue;
        $fileinfo = new SplFileInfo($file); // 获取文件信息对象
        // 以修改时间戳为键存入数组
        $files[$fileinfo->getMTime()] = array('name'=>$file,'mtime'=>date('Y:m:d:H:i:s', $fileinfo->getMTime()),'unixtime'=>$fileinfo->getMTime());
        $key = md5($file);
        
        if(array_key_exists($key, $stats_array)) {
            if($stats_array[$key][0] != date('Y:m:d:H:i:s', $fileinfo->getMTime())) {
                $stats_array[$key][2]++;
                $stats_array[$key][0] = date('Y:m:d:H:i:s', $fileinfo->getMTime());
            }
        } else {
            $stats_array[$key] = array(
                date('Y:m:d:H:i:s', $fileinfo->getMTime()),
                $file,
                1
            );
        }
        $datetime = new \DateTime();
        $datetime->setTimestamp($fileinfo->getMTime());
        $files[$fileinfo->getMTime()]['age'] = $datetime->diff(new \DateTime())->format('%H:%I:%S');
        if($datetime->diff(new \DateTime())->format('%a') != '0')
        {
            $days = ($datetime->diff(new \DateTime())->format('%a') == '1') ? ' 天 ' : ' 天 ';
            $files[$fileinfo->getMTime()]['age'] = $datetime->diff(new \DateTime())->format('%a') . $days . $files[$fileinfo->getMTime()]['age'];
        }
    }
    $dir->close(); // 关闭当前目录句柄
}

ksort($files); // 按修改时间升序排序
$newest_file = array_pop($files); // 取出最新修改的文件

foreach($stats_array as $stat) {
    $counter += $stat[2];
}

printf(
    "统计计数 %s. 最新更新时间(美国东部时间): %s 距离现在已过: <span class='update_time' mtime='%s'>%s</span>.",
    $counter,
    $newest_file['mtime'],
    $newest_file['unixtime'],
    $newest_file['age']
);


$put = '';
foreach($stats_array as $line) {
    $put .= implode("\t",$line)."\n";
}
file_put_contents($filestat_path,$put);
?>

扩展说明

如果需要新增检测目录,仅需在$target_dirs数组中追加对应的目录路径即可,无需修改其他逻辑。代码会自动遍历所有目录下的文件,计算所有文件中最新的更新距离当前的时长。

内容的提问来源于stack exchange,提问作者171124

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 19:36:04