在使用Symfony2探查器时,我努力找出404的原因。我正在使用Symfony 2.3 LTS。为什么Symfony2探查器在使用MemcachedProfilerStorage时抛出404s?
我在我们的开发环境中启用了Profiler,并且该问题可以在多个开发人员机器上再现。我们的探查配置为:
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
atonKernelResponse
中放置断点,我可以识别唯一的父令牌。 $this->saveProfiles($profile);
之后,我可以使用telnet为令牌手动查询memcached并接收预期的序列化数组。- 如果我单步执行代码,我最终发现自己在
TraceableEventDispatcher
。在saveInfoInProfile
中,在配置文件的子项目上有一个循环,其调用$this->saveInfoInProfile($child, true);
。我的例子中有6个儿童项目,前5个项目按预期坚持。 - 经过5次迭代
saveInfoInProfile
之后,原始令牌可以通过telnet获取并仍然出现。 - 在第6次(最后一次)迭代中,呼叫在
MemcachedProfilerStorage
to$this->getMemcached()->set($key, $value, time() + $expiration);
中进行。 - 之前这个调用,我仍然可以通过telnet检索原始令牌。
但是,在之后发出此调用,原始令牌的telnet请求返回为空。此调用的关键不同于原始标记,因此不会被覆盖。
这反过来触发了我看到客户端的404错误。
一些其他可能有用的信息:
- 工具栏上做一些网页的工作。这是我们的管理界面中有404个工具栏错误的页面。
- 我们使用ESI并使用Twig。
- 我们打电话到
{% render(controller("ABundle:AController:anAction", {some:params})) %}
- 消除从我们的嫩枝一个模板渲染方法一个解决问题。
- 恢复该渲染方法并注释掉另一个方法也将解决该问题。暗示有太多的孩子或太多的数据(或类似的东西)。
什么可能导致此问题?我将如何识别修补程序?
另外,使用FileProfiler可以正常工作。
谢谢你的帮助!
我猜你已经检查过防火墙/路由yml文件,如果他们配置正确? (404错误可能与'routing_dev.yml'中的缺失/注释路由有关) – tftd
探查器在某些页面上工作,所以路由必须广泛地工作。我进一步更新了这个问题,以包含该片段和一些额外的调查,这些调查表明Twig中的渲染方法对此问题有所贡献。 – edhgoose