open_basedir проблемы с APC и Symfony2
В настоящее время я настраиваю общую промежуточную среду для одного из наших приложений, написанную на PHP5.3 и использующую инфраструктуру Symfony2.
Если я размещаю только один экземпляр приложения на сервере, все работает как надо.
Однако, если я затем разверну дополнительные экземпляры приложения (которые могут или не могут использовать один и тот же код, в зависимости от настроек клиента), я получаю такие ошибки:
[Tue Nov 06 10:19:23 2012] [error] [client 127.0.0.1] PHP Warning: require(/var/www/vhosts/application1/httpdocs/vendor/doctrine-common/lib/Doctrine/Common/Annotations/AnnotationRegistry.php): failed to open stream: Operation not permitted in /var/www/vhosts/application2/httpdocs/app/bootstrap.php.cache on line 1193
[Tue Nov 06 10:19:23 2012] [error] [client 127.0.0.1] PHP Fatal error: require(): Failed opening required '/var/www/vhosts/application1/httpdocs/app/../vendor/doctrine-common/lib/Doctrine/Common/Annotations/AnnotationRegistry.php' (include_path='.:/usr/share/pear:/usr/share/php') in /var/www/vhosts/application2/httpdocs/app/bootstrap.php.cache on line 1193
По сути, второй сайт пытается запросить файлы с первого сайта, но из-за ограничений open_basedir он не может этого сделать. Я не хочу отключать open_basedir, так как это только маскирует проблему, а не решает ее, и создает зависимость между приложениями, которые не должны присутствовать.
Сначала я полагал, что это связано с ошибкой Symfony2, но теперь я отследил ее до проблемы с APC; Отключение APC также решает ошибку, но я обеспокоен влиянием производительности на это.
У кого-нибудь есть предложения по поводу того, что я мог бы сделать?
1 ответ
Хорошо, это оказалось проблемой с нашим собственным кодом, а не чем-то совершенно неправильным с APC или Symfony2.
Для справки любого, кто может столкнуться с этим:
Мы использовали компонент ApcUniversalClassLoader из Symfony2.
Это позволяет вам указать префикс для ваших файлов кэша.
Этот префикс был одинаковым для каждого экземпляра нашего приложения; именно поэтому он работал нормально, если на каждом сервере был только один экземпляр.
Поскольку префикс был тем же, APC попытался загрузить классы, принадлежащие первому экземпляру приложения, к которому был получен доступ сразу после перезапуска сервера.
Изменение префикса для разных экземпляров приложения приводит к правильному поведению, загружая классы из правильных папок.
Надеюсь, это не даст кому-то еще ударить головой о стол, когда они поймут, почему это не работает:)