对于Linux下包含几个字节的文件,我只需要处理它自上次处理以来的更改时间。clearstatcache(); filemtime();
我通过定期调用 PHP 来检查文件是否被更改。由于整个文件总是很小,删除对 filemtime 的调用并通过将内容与过去的内容进行比较来检查文件更改是否会提高性能?或者,就性能而言,最好的方法是什么。
问问题
7378 次
4 回答
15
采用filemtime + clearstatcache
增强@Ben_D 的测试:
<?php
$file = 'small_file.html';
$loops = 1000000;
// filesize (fast)
$start_time = microtime(1);
for ($i = 0; $i < $loops; $i++) {
$file_size = filesize($file);
}
$end_time = microtime(1);
$time_for_file_size = $end_time - $start_time;
// filemtime (fastest)
$start_time = microtime(1);
for ($i = 0; $i < $loops; $i++) {
$file_mtime = filemtime($file);
}
$end_time = microtime(1);
$time_for_filemtime = $end_time - $start_time;
// filemtime + no cache (fast and reliable)
$start_time = microtime(1);
for ($i = 0; $i < $loops; $i++) {
clearstatcache();
$file_mtime_nc = filemtime($file);
}
$end_time = microtime(1);
$time_for_filemtime_nc = $end_time - $start_time;
// file_get_contents (slow and reliable)
$start_time = microtime(1);
for ($i = 0; $i < $loops; $i++) {
$file_contents = file_get_contents($file);
}
$end_time = microtime(1);
$time_for_file_get_contents = $end_time - $start_time;
// output
echo "
<p>Working on file '$file'</p>
<p>Size: $file_size B</p>
<p>last modified timestamp: $file_mtime</p>
<p>file contents: $file_contents</p>
<h1>Profile</h1>
<p>filesize: $time_for_file_size</p>
<p>filemtime: $time_for_filemtime</p>
<p>filemtime + no cache: $time_for_filemtime_nc</p>
<p>file_get_contents: $time_for_file_get_contents</p>";
/* End of file */
于 2013-11-13T16:52:23.327 回答
8
我知道我参加聚会迟到了,但一点标杆从不影响讨论。Brian Roach 的直觉证明了声音,甚至在您考虑比较步骤之前:
考试:
$file = "small_file.html";
$file_size = filesize($file);
//get the filemtime 1,000,000 times
$start_time = microtime(true);
for($i=0;$i<1000000;$i++){
$set_time = filemtime($file);
}
$end_time = microtime(true);
$time_for_filemtime = ($end_time-$start_time);
//get the time for file_get_contents 1,000,000 times
$start_time = microtime(true);
$file = "small_file.html";
for($i=0;$i<1000000;$i++){
$set_time = file_get_contents($file);
}
$end_time = microtime(true);
$time_for_file_get_contents = ($end_time-$start_time);
echo "<p>Working on a file that is $file_size B long</p>
<p>filemtime: $time_for_filemtime vs file_get_contents: $time_for_file_get_contents";
结果
处理 41 B 长的文件
文件时间:0.36287999153137 vs file_get_contents:16.191468000412
没有什么令人震惊的:“向文件系统询问一些元数据”比“打开文件、读入并比较内容”要快。
于 2013-01-25T22:30:24.813 回答
4
要统计文件,您只需向文件系统询问一些元数据。
您的第二种方法涉及打开文件、读入并比较内容。
你认为哪个会更快?;)
于 2011-05-01T17:49:50.700 回答
3
我认为通知文件更改的最佳方法是inotify
,它正是为此目的而设计的。
请参阅inotify 扩展。
于 2011-05-01T17:49:30.370 回答