Symfony ESI缓存/代理监听器问题

时间:2015-06-09 15:54:20

标签: php symfony caching esi

我已经将一个产品部署到现场的Ubuntu 14.04服务器上,该服务器在app_dev中运行良好。但是,当我在应用程序中运行它时,会出现503错误,在应用程序日志文件中显示以下内容:

我在Vagrant设置中获得了完全相同的代码,相同的操作系统版本,它在app和app_dev

中均可正常运行

以前有人遇到过这个吗?

  

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

     

[2015-06-09 16:36:43] request.INFO:匹配的路线   " fos_user_security_login&#34 ;.   {" route_parameters" {" _controller":" FOS \ UserBundle \控制器\ SecurityController ::则loginAction"" _route":&#34 ; 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:" Catchable   致命错误:参数1传递给   Symfony的\分量\ HttpKernel \事件监听\ SurrogateListener :: __结构()   必须是一个实例   Symfony \ Component \ HttpKernel \ HttpCache \ SurrogateInterface,实例   给出Symfony \ Component \ HttpKernel \ HttpCache \ Esi,调用   第557行/var/www/xxxx/app/cache/prod/appProdProjectContainer.php   并定义了#34;在   /var/www/xxxx/vendor/symfony/symfony/src/Symfony/Component/HttpKernel/EventListener/SurrogateListener.php   第33行{"例外":" [对象]   (Symfony \ Component \ Debug \ Exception \ ContextErrorException(code:0):   可捕获的致命错误:参数1传递给   Symfony的\分量\ HttpKernel \事件监听\ SurrogateListener :: __结构()   必须是一个实例   Symfony的\分量\ 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)"}   []

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

1 个答案:

答案 0 :(得分:0)

叹息 - 总是如此。您花了半个小时试图解决它,然后在SO上发布问题,并在2分钟内自行解决!

考虑流浪者设置之间的设置差异,活动框有多个项目活动然后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根)作为密钥的前缀,只要它们是唯一的(它应该是),然后多个缓存就赢了&#39 ; t冲突。