0

我有一个产品已部署到实时 Ubuntu 14.04 服务器,它在app_dev. 但是,当我在应用程序中运行它时,它会出现 503 错误,应用程序日志文件中包含以下内容:

我在 Vagrant 设置中得到了完全相同的代码,相同的操作系统版本,它在应用程序和app_dev

有没有人遇到过这个?

Symfony 2.7.0 / Ubuntu 14.04 / Distro PHP / mySQL - 尝试清除缓存并重新安装所有作曲家包。

[2015-06-09 16:36:43] request.INFO:匹配路由“fos_user_security_login”。{"route_parameters":{"_controller":"FOS\UserBundle\Controller\SecurityController::loginAction","_route":"fos_user_security_login"},"request_uri":" http://xxxx/app.php/login "} []

[2015-06-09 16:36:43] security.INFO:使用匿名令牌填充 TokenStorage。[] []

[2015-06-09 16:36:43] request.CRITICAL:未捕获的 PHP 异常 Symfony\Component\Debug\Exception\ContextErrorException:“可捕获的致命错误:参数 1 传递给 Symfony\Component\HttpKernel\EventListener\SurrogateListener::__construct () 必须是 Symfony\Component\HttpKernel\HttpCache\SurrogateInterface 的实例,给定 Symfony\Component\HttpKernel\HttpCache\Esi 的实例,在 /var/www/xxxx/app/cache/prod/appProdProjectContainer.php 中调用557 并在 /var/www/xxxx/vendor/symfony/symfony/src/Symfony/Component/HttpKernel/EventListener/SurrogateListener.php 第 33 行定义”{“异常”:“[对象] (Symfony\Component\Debug\Exception \ContextErrorException(代码:0):可捕获的致命错误:参数 1 传递给 Symfony\Component\HttpKernel\EventListener\SurrogateListener::__construct() 必须是 Symfony\Component\HttpKernel\HttpCache\SurrogateInterface 的实例,给定 Symfony\Component\HttpKernel\HttpCache\Esi 的实例,在 /var/www/xxxx/app/cache/prod/appProdProjectContainer.php 上调用第 557 行,定义在 /var/www/xxxx/vendor/symfony/symfony/src/Symfony/Component/HttpKernel/EventListener/SurrogateListener.php:33)"} []

(对于那些建议对日志行进行代码格式化的人,它将它们格式化为一行,这基本上意味着必须滚动它们才能阅读它们,这比上面更糟糕)。

4

1 回答 1

0

叹息——总是这样。您花了半个小时尝试解决它,然后您将问题发布在 SO 上,并在 2 分钟内您自己解决了它!

考虑一下 vagrant 设置之间的设置差异是 live box 有超过 1 个项目处于活动状态,然后是 BINGO!我想到了。

应用程序环境使用 APC 来缓存类,是的,两个项目都有相同的 apc 缓存键!

快速更改密钥和重建缓存,一切都已修复!

我想我会回答这个问题,以防其他人有类似的问题。

更新:

对 app.php 的调整......

// As APC requires a unique key prefix, we'll use the directory above     web, which will be unique.
$curdir = pathinfo(getcwd());
$curdir = basename($curdir['dirname']);
$loader = new ApcClassLoader($curdir . '_', $loader);
$loader->register(true);

这使用 cwd 上方的文件夹(通常是 apache 的 doc 根目录)作为密钥的前缀,只要它们是唯一的(应该是唯一的),那么多个缓存就不会发生冲突。

于 2015-06-09T16:05:39.370 回答