Функция PHP filemtime – "stat failed for"

У меня проблема с функцией 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.