2009-05-04 5 views
5

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

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

+1

Что такое APC (все APC, о которых я могу думать, не имеют смысла в этом контексте)? –

+1

Брайан, это кеш кода операции, чтобы ускорить выполнение PHP. Я помещаю ссылку на него в текст вопроса, если вы хотите узнать больше. –

+0

беспорядочно! это также происходит при копировании файлов локально вместо их rsyncing? – stefs

ответ

7

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

в php.ini: apc.file_update_protection integer

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

После редактирования вопроса: Одна из причин, почему я не вижу таких проблем, - это то, что я нажимаю совершенно новую копию сайта (с экспортом SVN). Только после того, как это будет полностью завершено, это станет видимым для Apache/Mod_php (см. Мой ответ How to get started deploying PHP applications from a subversion repository?)

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

0

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

0

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

4

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

0

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

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

Сценарий поставляется с APC.

Hopet его помогает, Эверт

0

Это, вероятно, происходит потому, что есть несоответствие между кодом и кэшированные версии кода.

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

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

Смежные вопросы