多个 symfony 项目疯狂

multiple symfony project madness

我有一个使用 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"

太糟糕了,有一件很糟糕的事情。但是我不知道,作为我的同事,这到底是什么东西

有人知道吗?

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

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

如果上述情况属实,您的 web/app.php 中可能有一行如下所示:

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

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

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

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