如何用PHP检查目录内容是否已更改?

PHL*_*LAK 23 php directory last-modified filemtime

我正在用PHP编写一个照片库脚本,并有一个目录,用户将存储他们的照片.我正在尝试设置页面缓存并仅在目录内容发生更改时才刷新缓存.我想我可以通过使用filemtime()函数缓存目录的最后修改时间来完成此操作,并将其与目录的当前修改时间进行比较.但是,正如我已经意识到的那样,目录修改时间不会随着从该目录添加或删除文件而改变(至少在Windows上,还不确定Linux机器).

所以我的问题是,检查目录内容是否被修改的最简单方法是什么?

tro*_*skn 22

正如其他人已经提到的,解决此问题的更好方法是在特定事件发生时触发函数,从而更改文件夹.但是,如果您的服务器是unix,则可以使用它inotifywait来查看目录,然后调用PHP脚本.

这是一个简单的例子:

#!/bin/sh
inotifywait --recursive --monitor --quiet --event modify,create,delete,move --format '%f' /path/to/directory/to/watch |
  while read FILE ; do
    php /path/to/trigger.php $FILE
  done
Run Code Online (Sandbox Code Playgroud)

另见:http://linux.die.net/man/1/inotifywait

  • 在操作系统级别处理一些任务要好得多.例如,设置cronjob本质上是特定于操作系统的.在PHP中没有办法做到这一点. (6认同)
  • 我按照海报的问题去了.我们可以永远玩'假设'游戏...... (5认同)
  • 我认为解决方案应该保持在PHP级别.此解决方案将PHP应用程序与底层操作系统纠缠在一起并失去了可移植性. (3认同)
  • 这是关于使用PHP缓存HTML页面,它与PHP有关.让操作系统参与其中会使问题变得复杂.更不用说这个解决方案隐藏的隐藏魔法可能会让程序员感到困惑. (2认同)

小智 8

用户提交图像后触摸目录怎么样?Changelog说:要求php 5.3 for windows工作,但我认为它应该适用于所有其他环境


MSp*_*eij 6

呃.我只是存储目录列表的md5.如果内容更改,md5(目录列表)将更改.您可能会偶尔遇到md5冲突,但我认为这个机会足够小了.
或者,您可以在该目录中存储一个包含"上次修改"日期的小文件.但我会选择md5.


PS.第二个想法,看看你如何看待性能(缓存)请求和散列目录列表可能不是完全最佳的..


chi*_*hic 6

在php内部使用inotifywait

$watchedDir = 'watch';

$in = popen("inotifywait --monitor --quiet --format '%e %f' --event create,moved_to '$watchedDir'", 'r');
if ($in === false)
    throw new Exception ('fail start notify');

while (($line = fgets($in)) !== false) 
{
    list($event, $file) = explode(' ', rtrim($line, PHP_EOL), 2);
    echo "$event $file\n";
}
Run Code Online (Sandbox Code Playgroud)