Проблемы с APC при публикации


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

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

6 5

6 ответов:

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

В php.ini: apc.file_update_protection integer

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

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

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

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

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

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

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

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

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

Hopet его помогает, Evert

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

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

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