如何将检测两个目录更新时间的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
相关产品推荐
相关产品推荐

