PHP & APC & SVN не работающая инвалидация кэша при операциях с Subversion

// Февраль 4th, 2011 // PHP, Веб-разработка, Системы контроля версий (VCS)

Премия «грабли дня» сегодня присуждаются php-расширению «APC». Вкратце, APC это байт-код кэшер, который кэширует операцию преобразования php скрипта в байт-код, позволяя каждый раз не загружать код заново из файла, а по-быстрому доставать из сегмента shared memory. Ещё одно преимущество в том, что сегмент памяти шарится между процессами php, и когда на сайт заходит вторйо пользователь, то он идёт уже «на всё готовенькое».Ну пожалуй хватит петь дифирамбы APC, расскажу теперь об одном нюансе работы его вместе с системой контроля версий Subversion. У нас с недавнего времеи начали появляться непонятные ошибки, которых быть вообще не должно. Например, рандомно посреди кода вырубалась автозагрузка классов. Хотя, при отладке этого кода, в том же месте она прекрасно работала. Или, выпадало исключение типа «маршрут не найден», хотя в списке роутов Zend’а он был. На машинах разработчиков подобные баги не воспроизводились. Курение мануалов и второй час гугления навел меня на запрос APC & autoloading classes, а дальше на замечательный скриптик apc.php

Apc.php

Замечательная утилика, из поставки пакета php-apc. Она позволяет просматривать состояние памяти кэша, количество закэшированных файлов, фрагментацию кэша и много чего ещё.

А вот скриншот, на котором отображаются текущие загруженные файлы в кэше.

На первом скриншоте я выделил параметр apc.stat_ctime. У меня он стоял в 0. Что же это за параметр? Смотрим мануалку.

apc.stat_ctime integer

Verification with ctime will avoid problems caused by programs such as svn or rsync by making sure inodes haven’t changed since the last stat. APC will normally only check mtime.

http://www.php.net/manual/en/apc.configuration.php#ini.apc.stat-ctime

Что же происходит?
SVN на самом деле создает новые файлы, заменяет старые, и выставляет для них старую дату изменения. Это меняет индексные дескрипторы, а не mtime, и APC будет выполнять некорректный файл. Включение верификации ctime позволит избежать этой проблемы (будут проверяться индексные дескрипторы на предмет изменения).

После включения начали мониторить, вроде проблем нет (тьфу-тьфу-тьфу).

Share

Спасибо!


Если вам помогла статья, или вы хотите поддержать мои исследования и блог - вот лучший способ сделать это:


4 Responses to “PHP & APC & SVN не работающая инвалидация кэша при операциях с Subversion”

  1. Andrew:

    Спасибо за находку! Никогда не сталкивался с этим, но теперь буду иметь ввиду

  2. […] варианты, по дороге находится и исправляется куча других багов, но этот восстает аки Феникс. Тогда для меня […]

  3. Если я правильно понял, то APC лучше на production только ставить… т.е. ты деплоймент через svn на продакшене делаешь?

    • google.com Андрей Токарчук:

      Раньше делал. Сейчас для деплоймента пробую использовать capistrano, а для контроля версий — git. APC стоит и на деве и на проде, только настройки разные для разных окружений.

Комментировать