多个symfony项目疯狂

时间:2015-11-06 15:52:55

标签: php symfony nginx php-5.6

我有一个symfony3网站。一切都像魅力一样。 几天,我安装了另一个项目到另一个文件夹,然后用composer安装symfony(3)。

问题来了。第一个项目有效,但第二个项目无效。 但是,如果我重新启动FPM,并浏览第二个项目,它可以工作,但第一个出错了。 我也试过symfony2.7。相同的

文件夹结构是

/var/www/domain1
/var/www/domain2

默认情况下,项目使用相同的fpm-socket,但我尝试了不同的。

nginx配置如下:

server {
    server_name domain1;
    root /var/www/domain1/web;

    location / {
        try_files $uri /app.php$is_args$args;
    }
    location ~ ^/(app_dev|config)\.php(/|$) {
        fastcgi_pass unix:/var/run/php5-fpm-domain1.sock;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
    location ~ ^/app\.php(/|$) {
        fastcgi_pass unix:/var/run/php5-fpm-domain1.sock;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        internal;
    }

    location ~ /\.ht {
        deny all;
    }

    error_log /var/log/nginx/domain1_error.log;
    access_log /var/log/nginx/domain1_access.log;
}

server {
    server_name domain2;
    root /var/www/domain2/web;
    server_tokens off;

    location / {
        try_files $uri /app.php$is_args$args;
    }
    location ~ ^/(app_dev|config)\.php(/|$) {
        fastcgi_pass unix:/var/run/php5-fpm-domain2.sock;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
    location ~ ^/app\.php(/|$) {
        fastcgi_pass unix:/var/run/php5-fpm-domain2.sock;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        internal;
    }

    location ~ /\.ht {
        deny all;
    }

    error_log /var/log/nginx/domain2_error.log;
    access_log /var/log/nginx/domain2_access.log;
}

fpm配置:

[domain1]
user = www-data
group = www-data
listen = /var/run/php5-fpm-domain1.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0660

pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3

chdir = /

[domain2]
user = domain2
group = domain2
listen = /var/run/php5-fpm-domain2.sock
listen.owner = domain2
listen.group = domain2
listen.mode = 0660

pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3

chdir = /

php_admin_value[error_log] = /var/log/fpm-php.domain2.log
php_admin_flag[log_errors] = on

domain2用户也存在,并且该文件夹的用户。许可是好的。

但是日志说(这很奇怪),二次打开的项目想要从另一个项目中读取o.0

我的意思是,日志是这样的:

2015/11/05 13:17:04 [error] 26029#0: *33508 FastCGI sent in stderr: "PHP message: PHP Fatal error:  Class 'AppBundle\AppBundle' not found in /var/www/domain2/app/AppKernel.php on line 19
PHP message: PHP Stack trace:
PHP message: PHP   1. {main}() /var/www/domain2/web/app_dev.php:0
PHP message: PHP   2. Symfony\Component\HttpKernel\Kernel->handle() /var/www/domain2/web/app_dev.php:33
PHP message: PHP   3. Symfony\Component\HttpKernel\Kernel->boot() /var/www/domain1/vendor/symfony/symfony/src/Symfony/Component/HttpKernel/Kernel.php:183
PHP message: PHP   4. Symfony\Component\HttpKernel\Kernel->initializeBundles() /var/www/domain1/vendor/symfony/symfony/src/Symfony/Component/HttpKernel/Kernel.php:121
PHP message: PHP   5. AppKernel->registerBundles() /var/www/domain1/vendor/symfony/symfony/src/Symfony/Component/HttpKernel/Kernel.php:435" while reading response header from upstream, client: 46.139.10.151, server: domain2, request: "GET /app_dev.php HTTP/1.1", upstream: "fastcgi://unix:/var/run/php5-fpm-domain2.sock:", host: "domain2"

Sooo,有一些非常糟糕的事情。但我不知道,作为我的同事,这到底是什么。

有人有线索吗?

1 个答案:

答案 0 :(得分:1)

好的,我不知道您的确切设置,但我的猜测如下:

  • 您已从Symfony 2.x升级Symfony3项目。
  • 您正在使用Symfony应用程序的ApcCacheLoader中的web/app.php

如果以上情况属实,则web/app.php中可能会有一行如下所示:

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

如果在同一服务器上的两个或多个Symfony安装中有此行,则两个应用程序的自动加载器缓存都会发生冲突。

为什么?顾名思义,ApcClassLoader在APC中存储文件和命名空间的列表,它将使用第一个构造函数参数作为缓存键。

因此,显然,您需要更改该值,然后使用app/console --env=prod重建缓存。也许你还必须再次运行composer install,我不确定那个。