в моем PHP проекта, я использую какой-то счетчик, который присоединяет к существующей (или новый файл) очень часто:Узнайте Еореп (..., «а») создан ли новый файл
$f = fopen($filename, 'ab');
fwrite($f);
fclose($f);
Когда создается новый файл, я должен изменить разрешения этого файла, так как другой пользователь может получить доступ к файлу, а также:
$existed = file_exists($filename);
// Do the append
$f = fopen($filename, 'ab');
fwrite($f);
fclose($f);
// Update permissions
if (!$existed) {
@chmod($filename, 0666);
}
есть ли способ, чтобы выяснить, является ли «а» (присоединять) создал новый файл или добавленный к выходящему без использования file_exists()
? Насколько я понимаю, file_exists()
извлекает статистику файла, что приводит к ненужным накладным расходам по сравнению с простым файловым добавлением. Поскольку функция используется очень часто, мне интересно, есть ли возможность определить, создал ли fopen(..., 'a')
новый файл без использования file_exists()
?
Примечание: Это в основном вопрос стиля и интереса, а не настоящая проблема с производительностью. Но если я ошибаюсь, и fopen()
уже получает статистику файла, пожалуйста, дайте мне знать!
Update
Хорошо, это действительно довольно академический вопрос. Вот некоторые тесты производительности, выполняемые в системе Windows (Apache, Win8.1 - без разрешений файлов UNIX) и Linux-машина (Nginx, Ubuntu 14.04, virutal machine).
Каждый тестовый прогон с 1000 повторениями, файл удаляется до первого повторения.
Win Linux
simply append one byte 1.8ms 9.4ms
append + clearstatcache() 1.8ms 9.3ms
test fileexists() + append 2.2ms 10.5ms
fileexists() + append + clear 2.2ms 11.0ms
append + chmod() 2.7ms 12.3ms
append + fileexists() -> chmod() 3.3ms 10.6ms
Примечание: последний из них использует и IF в пределах тестового цикла.
http://php.net/manual/en/function.fopen.php – hek2mgl