Zend_Cache_Backend_Apc и shared memory segments

В этом посте я напишу об одной банальной истине, а именно о распределении адресного пространства. В ОС Linux все процессы работают каждый в своём адресном пространстве, что логично 🙂 Зачем я это написал читайте под катом.

Сегодня мы решили использовать самый быстрый (из бесплатных) вариант кэширования информации между запросами – кэширование в APC. Т.к. мы уже переставили eaccelerator на Apc, то дело оставалось лишь в конфигурировании. Для управления кэшем мы используем классы ZF, а именно Zend_Cache_Manager, Zend_Cache_Frontend_* и Zend_Cache_Backend_*. Для работы с APC предусмотрен собственно Zend_Cache_Backend_Apc, который кэширует в оперативную память выделяя shared memory segments. Из названия видно, что они являются общими для процессов php, и поэтому позволяют реализовать кэш между запросами пользователей. Интерпретирует php у нас php5-fpm, но также есть и консольный php-cli для разного рода служебных задач. Одной из которых как раз и была очистка КЭШа.

Проблема…

…состояла в том, что у нас не очищался КЭШ. При отладке уже даже стали делать без ZF, писали чистые php команды apc_store() и apc_delete()/apc_clear(). Очищался КЭШ через консольную утилитку. Это и было проблемой.

Решение

Оказывается всё было ужас как банально. Сохраняли мы в сегмент памяти процесса php-fpm, а удаляли из сегмента памяти процесса php (cli). А там ничего и не было. Решение нашлось быстро, мы просто сделали из консоли HTTP-запрос wget’ом и начал удаляться нужный сегмент.

Мораль

PHPшнику всё-таки надо чуть-чуть разбираться в инфраструктуре интерпретатора, т.к. иногда такие вот вещи могут поставить в тупик.

Leave a Comment