Для файла, содержащего несколько байтов в Linux, мне нужно только обрабатывать, когда он был изменен с момента последнего его обработки. Я проверяю, был ли файл изменен, вызвав PHP clearstatcache(); filemtime();
clearstatcache(); filemtime();
периодически. Поскольку весь файл всегда будет крошечным, было бы ли улучшение производительности удалять вызов filemtime и проверять изменение файла, сравнивая содержимое с прошлым содержимым? Или лучший способ для этого, с точки зрения производительности.
Использовать 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 */
Я знаю, что опаздываю на вечеринку, но небольшой бенчмаркинг никогда не повредит дискуссиям. Интуиция Брайана Роуча доказывает звуки, даже если вы не учтете шаг сравнения:
$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
filemtime: 0.36287999153137 vs file_get_contents: 16.191468000412
Отсутствие шока: «запрос файловой системы для некоторых метаданных» быстрее, чем «открытие файла, чтение его и сравнение содержимого».
Чтобы установить файл, вы просто запрашиваете файловую систему для некоторых метаданных.
Второй подход включает открытие файла, его чтение и сравнение содержимого.
Как вы думаете, что будет быстрее? 😉
Я думаю, что лучший способ уведомления об изменениях в файле – это inotify
, который предназначен именно для этой цели.
См. Расширение inotify .