在使用Symfony2探查器时,我很难确定404的原因。我正在使用Symfony 2.3 LTS。
我在开发环境中启用了探查器,并且该问题可在多台开发人员计算机上重现。我们的分析器配置是:
framework:
profiler:
dsn: "memcached://localhost:11211"
enabled: true
lifetime: 86400 # Keep profiles for a day at most
在某些页面(但不是全部)页面上,我们看到如下错误:
**The page at https://local.dev says:**
An error occurred while loading the web debug toolbar (404: Not Found).
Do you want to open the profiler?
OK / Cancel
https://local.dev/_wdt/<token>
有5 404个请求,点击取消会将我们带到https://local.dev/_profiler/<token>
我已经尝试逐步完成代码,到目前为止已经确定:
ProfilerListener
at onKernelResponse
中放置一个断点,我可以识别唯一的父令牌。$this->saveProfiles($profile);
之后,我可以使用telnet手动查询memcached以获取令牌并接收预期的序列化数组。TraceableEventDispatcher
。在saveInfoInProfile
中,调用$this->saveInfoInProfile($child, true);
的个人资料的子项有一个循环。我的案例中有6个子项目,前5个项目按预期保留。saveInfoInProfile
次迭代后,原始令牌可以通过telnet检索并仍然显示。MemcachedProfilerStorage
to $this->getMemcached()->set($key, $value, time() + $expiration);
中进行调用。 但是, 此调用之后,原始令牌的telnet请求将返回空。此调用的密钥与原始令牌不同,因此不会被覆盖。
这反过来会触发我遇到客户端的404错误。
一些其他可能有用的信息:
{% render(controller("ABundle:AController:anAction", {some:params})) %}
可能导致此问题的原因是什么?我如何识别修复?
顺便说一句,使用FileProfiler工作正常。
感谢您的帮助!
答案 0 :(得分:2)
经过多次敲击后我发现了这个解决方案。
似乎由于我们在模板中使用了很多渲染,因此正在收集大量的探查器数据。
此分析器数据正被推送到memcached中。并且,因为有很多,其他数据被驱逐。我通过运行发现了这个:
echo stats | nc 127.0.0.1 11211 | grep evic
每次我加载页面时,都会看到evicted_unfected
和evictions
爬升。
解决方案是将memcached内存池的大小从标准的64MB增加到256MB(或任何其他大小)。
这是通过在运行时传递-m
选项来完成的。