多个 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
,我不确定那个。
我有一个使用 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
,我不确定那个。