Загруженный класс находится в неправильном каталоге

У меня действительно очень странный баг.

У меня есть два vhosts на одной машине: staging и production.

Они расположены в /var/www/staging/ и /var/www/production/. Я развертываю свой проект Symfony2 через Capifony (расширение capistrano для symfony2), поэтому веб-каталог находится в /var/www/staging/current/web/

Когда я echo __DIR__ в своем контроллере получаю

/var/www/production/releases/20130424075147/src/Acme/DemoBundle/Controller

Что правильно. Однако, если я сейчас получу объект из своего репозитория (например)

$object = $this->getDoctrine()->getManager()->getRepository('AcmeDemoBundle:Object')->findOneById(1);

И сделайте echo $object->getUploadRootDir() (из книги рецептов), в котором используется __DIR__ Я внезапно получаю

/var/www/staging/releases/20130424075333/src/Acme/DemoBundle/Entity/../../../../web/upload/

Каким-то образом при загрузке объекта он переключился на промежуточную среду вместо производственной (две разные папки выпуска просто потому, что между производственной и промежуточной версиями есть разные выпуски).

Это из-за автозагрузки? Ошибка конфигурации в vhosts?

Ниже приведены мои два vhosts

<VirtualHost *:80>
    DocumentRoot "/var/www/production/current/web"
    ServerName  example.com
    ServerAlias www.example.com example.com
    SetEnv      SYMFONY_ENV prod
    SetEnv      SYMFONY_DEBUG 0

    <Directory /var/www/production/current/web>
        RewriteEngine On

        RewriteCond %{HTTP_HOST} !^www\.
        RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]

        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteRule ^(.*)$ app.php [QSA,L]
    </Directory>
</VirtualHost>

<VirtualHost *:80>
    DocumentRoot "/var/www/staging/current/web"
    ServerName  staging.example.com
    ServerAlias staging.example.com
    SetEnv      SYMFONY_ENV dev
    SetEnv      SYMFONY_DEBUG 1

    <Directory /var/www/staging/current/web>
        RewriteEngine On
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteRule ^(.*)$ app.php [QSA,L]
    </Directory>
</VirtualHost>

person Bram    schedule 24.04.2013    source источник
comment
А как насчет кеша? Или ссылки на доктрину...? Или конфигурация Symfony/Doctrine...? Я предполагаю, что вы просто скопировали + вставили из стадии в производство или используете какие-либо инструменты контроля версий (такие как Git, SVN, ...)?   -  person shadyyx    schedule 24.04.2013
comment
Я использую Git и Capistrano для развертывания. Мне помог наш сисадмин, опубликую ответ.   -  person Bram    schedule 24.04.2013


Ответы (1)


Проблема была в АПК.

В app.php у меня было

$loader = new ApcClassLoader('sf', $loader);

что вызвало перекрывающиеся проблемы в записях кода операции apc (dixit нашего системного администратора).

Исправление было простым:

    $loader = new ApcClassLoader($_SERVER['HTTP_HOST'], $loader);
person Bram    schedule 24.04.2013