Вопрос

Недавно мы включили APC на наших серверах, а иногда и когда мы публикуем новый код или изменения, мы обнаруживаем, что исходные файлы, которые были изменены, начинают выдавать ошибки, которые не отражены в коде, обычно анализируют ошибки, описывающие несуществующий токен. Мы убедились в этом, запустив php -l для файлов, которые, по сообщениям журналов ошибок, затронуты. Обычно повторная публикация устраняет проблему. Мы используем PHP 5.2.0 и APC 3.01.9. У меня вопрос, сталкивался ли кто-нибудь еще с этой проблемой, или кто-то знает, в чем наша проблема? Если так, как вы это исправили или как мы могли это исправить?

Изменить. Возможно, мне следует добавить некоторые подробности о нашем процессе публикации. Контент передается на рабочие серверы через rsync с промежуточного сервера. Мы включили apc.stat_ctime , потому что он сказал, что это помогает работать более гладко с rsync. apc.write_lock включен по умолчанию, и мы не отключили его. То же самое для apc.file_update_protection .

Это было полезно?

Решение

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

в php.ini: apc.file_update_protection integer

  Настройка

apc.file_update_protection   задерживает кэширование   файлы. По умолчанию это 2 секунды, которые   означает, что если модификация   отметка времени (mtime) в файле показывает, что   возраст менее 2 секунд   доступ к нему не будет кэшироваться.   Несчастный человек, который получил доступ   этот наполовину написанный файл все равно увидит   странность, но, по крайней мере, это не так   сохраняются.

После редактируемого вопроса: одной из причин, по которой я не вижу подобных проблем, является то, что я нажимаю целую новую копию сайта (с экспортом SVN). Только после того, как это будет полностью завершено, он станет видимым для Apache / Mod_php (см. Мой ответ Как начать развертывание приложений PHP из хранилища subversion? )

Конечно, может случиться и другое: если вы обновляете на месте, вы можете обновлять файлы, которые зависят от других, которые еще не были загружены. Rsync может гарантировать атомарные обновления только для отдельных файлов, а не для всей коллекции, которая изменяется / загружается. Еще одна причина, я думаю, чтобы загрузить сайт в массовом порядке, и только после этого использовать.

Другие советы

Похоже, APC не выполняет предварительную обработку или не получает правильную информацию о состоянии файла. Вы можете проверить это, чтобы убедиться, что конфигурация APC apc. stat установлен правильно. Еще одна вещь, которую вы могли бы сделать - принудительно очистить кеш с помощью apc_clear_cache ( ) при публикации нового кода.

Никогда раньше этого не видел, даже если я большой пользователь APC. Может быть, попытаться запустить сценарий, который очищает код операции APC каждый раз, когда вы отправляете новый код на сервере?

Когда вы получите файл с ошибкой синтаксического анализа, создайте его резервную копию и повторите печать. Возьмите тот же самый файл, который сейчас работает, и выполните сравнение файла с ошибкой разбора.

ctime означает время создания. Вам нужно будет вручную очищать весь кэш каждый раз, когда вы делаете обновления.

Вы можете легко это сделать, разместив скрипт apc.php где-нибудь на вашем сервере. Этот скрипт предоставляет вам статистику кэша и позволит вам полностью удалить кеш.

Скрипт поставляется с APC.

Надеюсь его поможет, Эверт

Вероятно, это происходит из-за несоответствия между вашим кодом и кэшированными версиями кода.

Например, у APC есть кэшированная версия User.php, но вы внесли изменения в User.php или в данные, которые использует пользователь. Кэшированная версия все еще работает даже после вашего развертывания, потому что срок ее действия еще не истек.

Если вы очистите записи кэша APC при развертывании, эта проблема должна исчезнуть.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top