apache2.4.7虚拟主机上的多个php/symfony2应用程序


Multiple php/symfony2 applications on apache 2.4.7 virtual host

我遇到了一个非常奇怪的问题,因为我被迫将我的一些symfony2应用程序移动到一个使用Ubuntu 14.04和Apache2 2.4.7的新服务器上。

在同一服务器上有4个不同的symfony2应用程序,配置有虚拟主机。每个都有自己的域、系统中的帐户和配置。

奇怪的是,一旦我重新启动apache2服务器(或重新加载配置),这4个站点中只有一个可以工作,这将是在浏览器中键入的第一个。所有其他页面都会产生这种错误:

[Tue Sep 09 10:30:27.437009 2014] [:error] [pid 16400] [client XXX.XXX.XXX.XXX:44531] PHP Fatal error:  Class 'Avalanche''Bundle''ImagineBundle''AvalancheImagineBundle' not found in /home/user1/project/app/AppKernel.php on line 27

[Tue Sep 09 10:41:47.794413 2014] [:error] [pid 16398] [client XXX.XXX.XXX.XXX:44947] PHP Fatal error:  Class 'Project2''CoreBundle''Project2Bundle' not found in /home/user2/project2/app/AppKernel.php on line 19

非常奇怪的是,它只发生在所有没有作为apache2重启/重新加载后的第一个站点访问过的站点上。

我想,所有的站点都有一个合适的虚拟主机配置:

<VirtualHost *:80>
    ServerAdmin me@server.com
    ServerName project1.nl 
    ServerAlias www.project1.nl
    DocumentRoot "/home/user1/project1/web"
    DirectoryIndex app.php
    <Directory "/home/user1/project1/web">
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Require all granted
    </Directory>
    ErrorLog ${APACHE_LOG_DIR}/project1-error.log
    CustomLog ${APACHE_LOG_DIR}/project1-access.log combined
</VirtualHost>

有人知道从哪里开始寻找吗?我检查了虚拟主机的多个配置,php-fpm配置,每个应用程序的配置,但我找不到出路。

这是xcache的问题(http://xcache.lighttpd.net/ticket/337)设置opcache.optimization_level=0为我解决了这个问题。

这是我们的vhost设置之一,适用于sf2

ServerName demo.example.fr
ServerAlias demo.example.fr
ServerAdmin admin@example.fr
DocumentRoot /var/www/vhosts/demo.example.fr/httpdocs/web/
<Directory /var/www/vhosts/demo.example.fr/httpdocs/web/>
    Options Indexes FollowSymLinks MultiViews
    AllowOverride None
    Order allow,deny
    allow from all
    <IfModule mod_rewrite.c>
        RewriteEngine On
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteRule ^(.*)$ /app.php [QSA,L]
    </IfModule>
</Directory>

正如您所注意到的,我们没有设置目录索引,只有一个用mod_rewrite 重写的url

您的配置中有一些内容。

在Apache 2.4中,您必须使用+-定义选项。

Options -Indexes +FollowSymLinks +MultiViews

您不需要DirectoryIndex,因为它已在.htaccess文件中重写。

我希望你已经用a2ensite启用了所有配置,否则所有其他vhost文件都不会加载。

下一步是清除完整的Symfony2缓存文件夹,如果你使用它,请清除你的APC缓存。有时APC缓存一些对象,你会遇到一些奇怪的错误。

在升级到Ubuntu 14.04和Apache 2.4.7后,我花了两天时间试图解决这个完全相同的问题。

对我来说,解决这个问题的方法是禁用xcache,因为它缓存了在php应用程序/控制台缓存后调用的第一个应用程序的文件:clear或php composer.phar更新,这导致有时得到应用程序a,有时得到应用程序B。

当我在应用程序A的各个步骤中添加var_dump指令来调试symfony2时,我发现了这一点。当我进入$kernel->handle()(从app.php调用)时,无论我尝试了什么,我都无法获得任何输出。我怀疑应用程序B的AppKernel被调用了,但当我试图修改它时,它并没有改变结果。这是我意识到文件被缓存在某个地方的时候。我没有注意到这一点,因为我没有安装apc,但显然xcache已经启用。

我想这个问题的出现是因为名称空间和类名在两个symfony2应用程序中完全相同。。。

我将尝试看看是否可以为xcache的每个应用程序添加前缀,以了解它们的不同。

TLDR:禁用xcache,因为使用apache2的原始配置,它无法区分两个应用程序并混淆缓存。