我正在用PHP编写一个照片库脚本,并有一个目录,用户将存储他们的照片.我正在尝试设置页面缓存并仅在目录内容发生更改时才刷新缓存.我想我可以通过使用filemtime()函数缓存目录的最后修改时间来完成此操作,并将其与目录的当前修改时间进行比较.但是,正如我已经意识到的那样,目录修改时间不会随着从该目录添加或删除文件而改变(至少在Windows上,还不确定Linux机器).
所以我的问题是,检查目录内容是否被修改的最简单方法是什么?
正如其他人已经提到的,解决此问题的更好方法是在特定事件发生时触发函数,从而更改文件夹.但是,如果您的服务器是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
另见:http://linux.die.net/man/1/inotifywait
用户提交图像后触摸目录怎么样?Changelog说:要求php 5.3 for windows工作,但我认为它应该适用于所有其他环境
呃.我只是存储目录列表的md5.如果内容更改,md5(目录列表)将更改.您可能会偶尔遇到md5冲突,但我认为这个机会足够小了.
或者,您可以在该目录中存储一个包含"上次修改"日期的小文件.但我会选择md5.
PS.第二个想法,看看你如何看待性能(缓存)请求和散列目录列表可能不是完全最佳的..
在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"; }