【问题标题】:multiple symfony project madness多个 symfony 项目疯狂
【发布时间】:2015-11-06 15:52:54
【问题描述】:

我有一个带有 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,有一些非常糟糕的事情。但我不知道,作为我的同事,这到底是什么。

有人知道吗?

【问题讨论】:

    标签: php symfony nginx php-5.6


    【解决方案1】:

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

    • 您已从 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,我不确定那个。

    【讨论】:

    • 不,我用 composer 安装 3.0.0-dev 版本。但解决方案并非如此。我开始搜索那个sn-p的代码,但是在psr4中看起来不一样。所以,我在 app dev 中用 apc 取消注释所有行,重新启动 fpm。我发现,我没有安装 php-apc,所以我很容易得到它。之后,开发环境开始工作,但不是生产环境。删除缓存等,但不起作用。 Sooo,我评论了 app.php,一切正常 o.0
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-12
    • 1970-01-01
    • 2011-04-06
    • 1970-01-01
    • 1970-01-01
    • 2012-01-17
    相关资源
    最近更新 更多