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
呃.我只是存储目录列表的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";
}
Run Code Online (Sandbox Code Playgroud)