У меня проблема с функцией PHP filemtime. В моем webapp я использую механизм шаблонов Smarty с параметром кеширования. В моем webapp я могу сделать некоторые действия, которые генерируют ошибку, но позволяют сосредоточиться только на одном действии. Когда я нажимаю ссылку на странице, содержимое обновляется – я могу щелкнуть несколько раз, и все в порядке, но примерно один запрос на 10 не удался. Произошла следующая ошибка:
filemtime() [<a href='function.filemtime'>function.filemtime</a>]: stat failed for
и строка, которая вызывает проблему:
return ($_template->getCachedFilepath() && file_exists($_template->getCachedFilepath())) ? filemtime($_template->getCachedFilepath()) : false ;
Как видите, файл существует, потому что он проверен.
Проблемная строка кода включена в smarty_internal_cacheresource_file.php
(часть Smarty lib v3.0.6)
Приложение запускается в системе UNIX, внешнем хостинге.
Есть идеи? Должен ли я публиковать более подробную информацию?
file_exists
внутренне использует системный вызов access
который проверяет разрешения как реального пользователя, тогда как filemtime
использует stat
, который выполняет проверку как эффективный пользователь. Поэтому проблема может быть укоренена в предположении эффективного пользователя == реального пользователя, который не выполняется. Еще одно объяснение заключается в том, что файл удаляется между двумя вызовами.
Поскольку как результат $_template->getCachedFilepath()
и существование файла могут меняться между системными вызовами, почему вы вообще вызываете file_exists
? Вместо этого я бы предложил просто
return @filemtime($_template->getCachedFilepath());
Если $_template->getCachedFilepath()
можно установить на фиктивное значение, например false
, используйте следующее:
$path = $_template->getCachedFilepath(); if (!$path) return false; return @filemtime($path);
Использование:
Smarty::muteExpectedErrors();
Прочтите это и это
Я использовал filemtime успешно, не проверяя «file_exists» в течение многих лет. То, как я всегда интерпретировал документацию, заключается в том, что FALSE следует возвращать из файла «filemtime» при любой ошибке. Затем несколько дней назад произошло что-то очень странное. Если файл не существует, мое задание Cron завершилось с результатом. Результат был не в выходе программы, а на выходе Cron. Сообщение было «превышено длина файла». Я знал, что задание Cron закончилось в заявлении filemtime, потому что я отправил электронное письмо до и после этого заявления. Электронная почта «после» никогда не поступала.
Я установил файл fileexex проверки файла, чтобы исправить работу Cron. Однако это не должно было быть необходимо. Я все еще не знаю, что было изменено на сервере хостинга, который я использую. Несколько других заданий Cron начали работать в тот же день. Я еще не знаю, имеют ли они какое-либо отношение к filemtime.