Сбой веб-сайта (неустранимая ошибка PHP), когда html-кодер сохраняет умные шаблоны

У нас довольно большой веб-сайт (около 400 тысяч просмотров страниц в день) и мы используем Smarty в качестве механизма шаблонов. Кодировщик HTML меняет шаблоны каждый день, и каждое изменение шаблона (почти каждое) вызывает сбой сайта из-за PHP Fatal error: Call to undefined function _smarty_tplfunc_f0cb5c08ca1726d224308f2f6bd56b4f_0() in ... PS: Да, мы используем $smarty->compile_check для немедленного просмотра изменений шаблона.

Чтобы исправить эту ошибку, мы очищаем весь кеш сайта. Я не чувствую себя комфортно с ним!

Кто знает, как я могу это исправить? И почему эта ошибка возникает каждый раз (почти каждый раз) при смене шаблона.

Спасибо.


person Kirzilla    schedule 21.07.2010    source источник
comment
После того, как кеш восстановился, все в порядке?   -  person MrWhite    schedule 21.07.2010
comment
Да, точно! При перегенерации кеша - все ок. Мне кажется, что эта ошибка возникает из-за того, что шаблон еще не загружен на 100% на ftp, а Smarty уже думает, что файл изменен.   -  person Kirzilla    schedule 21.07.2010


Ответы (1)


Лучший способ избежать подобных проблем — загрузить во временный файл, а затем переименовать его. Таким образом, нет шансов на появление частичного файла.

А почему это происходит каждый раз, подумайте об этом. 400 тысяч просмотров страниц в день == в среднем 4,6 запроса в секунду. Учитывая, что большинство сайтов, которые я когда-либо видел, имеют гораздо больший трафик в определенные часы (в течение дня), я подозреваю, что вы видите от 10 до 20 запросов в секунду. при такой скорости, если запись файла (из-за загрузки) занимает больше 0,05 секунды, вероятность чтения во время записи резко возрастает.

Итак, ваш выбор (в порядке от наиболее надежного к наименее. Вы всегда можете сделать несколько):

  1. Делайте загрузку в нерабочее время, когда трафик (надеюсь) ниже...
  2. Используйте FTP-сервер, который сделает за вас бит переименования.
  3. Вручную переименуйте файл при загрузке нового. (Важно: переименовать, чтобы перезаписать оригинал. Не удаляйте и не перемещайте оригинал первым)...
  4. Взломайте Smarty, чтобы игнорировать новые файлы с отметкой времени менее 10-30 секунд (просто вызовите filemtime(), чтобы определить, когда он был изменен в последний раз. Обязательно сначала вызовите clearstatcache(), чтобы не получить старое время)...
person ircmaxell    schedule 22.07.2010
comment
Здравствуйте, спасибо за ваши советы. Я попробую их завтра. Особенно мне нравится идея с небольшой модификацией кода Smarty. - person Kirzilla; 22.07.2010
comment
Только что попробовал использовать touch template.tpl вместо очистки кеша - работает отлично, думаю переименование поможет (чуть позже проверю) - person Kirzilla; 22.07.2010