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.

Для справки любого, кто может столкнуться с этим:

  1. Мы использовали компонент ApcUniversalClassLoader из Symfony2.

  2. Это позволяет вам указать префикс для ваших файлов кэша.

  3. Этот префикс был одинаковым для каждого экземпляра нашего приложения; именно поэтому он работал нормально, если на каждом сервере был только один экземпляр.

  4. Поскольку префикс был тем же, APC попытался загрузить классы, принадлежащие первому экземпляру приложения, к которому был получен доступ сразу после перезапуска сервера.

  5. Изменение префикса для разных экземпляров приложения приводит к правильному поведению, загружая классы из правильных папок.

Надеюсь, это не даст кому-то еще ударить головой о стол, когда они поймут, почему это не работает:)

Другие вопросы по тегам