在使用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