Назад | Перейти на главную страницу

проблемы 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 также решает проблему, но меня беспокоит влияние этого на производительность.

Есть ли у кого-нибудь предложения о том, что я могу сделать?

Хорошо, это оказалась проблема с нашим собственным кодом, а не с APC или Symfony2.

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

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

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

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

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

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

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