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

Премия “грабли дня” сегодня присуждаются 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 позволит избежать этой проблемы (будут проверяться индексные дескрипторы на предмет изменения).

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

4 Comments

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

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

Leave a Reply to Андрей Токарчук Cancel reply