PHP filemtime функция - «сбой статистики для» - PullRequest
8 голосов
/ 19 августа 2011

У меня проблема с функцией PHP filemtime. В моем веб-приложении я использую шаблонный движок Smarty с опцией кэширования. В моем веб-приложении я могу выполнять некоторые действия, которые вызывают ошибку, но давайте сосредоточимся только на одном действии. Когда я нажимаю на ссылку на странице, содержимое обновляется - я могу щелкнуть несколько раз, и все в порядке, но один запрос на 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, внешний хостинг.

Есть идеи? Должен ли я публиковать более подробную информацию?

Ответы [ 3 ]

10 голосов
/ 19 августа 2011

file_exists внутренне использует системный вызов access, который проверяет разрешения от имени пользователя real , тогда как filemtime использует stat, который выполняет проверку как эффективный пользователь. Следовательно, проблема может быть основана на предположении, что эффективный пользователь == реальный пользователь, который не имеет места. Другим объяснением может быть удаление файла между двумя вызовами.

Поскольку и результат $_template->getCachedFilepath(), и существование файла могут изменяться между системными вызовами, почему вы вообще вызываете file_exists? Вместо этого я бы предложил просто

return @filemtime($_template->getCachedFilepath());

Если для $_template->getCachedFilepath() можно установить фиктивное значение, например false, используйте следующее:

$path = $_template->getCachedFilepath();
if (!$path) return false;
return @filemtime($path);
2 голосов
/ 16 мая 2012

Использование:

Smarty::muteExpectedErrors();

Читать это и это

0 голосов
/ 05 сентября 2011

Я успешно использовал filemtime, не проверяя file_exists в течение многих лет.Я всегда интерпретировал документацию так, что FALSE должен возвращаться из «filemtime» при любой ошибке.Затем несколько дней назад произошло нечто очень странное.Если файл не существует, мое задание Cron завершается с результатом.Результат был не в выводе программы, а в выводе Cron.Сообщение было «длина файла превышена».Я знал, что работа Cron завершилась в заявлении filemtime, потому что я отправил себе электронное письмо до и после этого заявления.Письмо «после» не пришло.

Я вставил в файл проверку file_exists, чтобы исправить задание Cron.Однако это не должно было быть необходимым.Я до сих пор не знаю, что изменилось на хостинг-сервере, который я использую.Несколько других заданий Cron начали терпеть неудачу в тот же день.Я пока не знаю, имеют ли они какое-либо отношение к filemtime.

...