2012-07-27 31 views
0

這對我來說很有趣,我也檢查過它。您可以閱讀NewRequest訂閱者在每次請求時被調用3次(或啓用debug_toolbar時爲7次),而BeforeRender訂閱者在每次請求時被調用1次(啓用debug_toolbar時>> 30次)。金字塔:爲什麼NewRequest訂戶在每次請求中都會調用3次?

所以,如果我想通過NewRequest事件會做3次,每次請求MongoDB的連接到我的項目...

這是爲什麼?爲什麼服務器每次請求都要做同樣的工作3次?

在此先感謝!

+1

您不應該在用戶中創建到MongoDB的連接。我爲金字塔寫了一個插件。連接在啓動時完成。數據庫句柄在app_factory或root_factory中完成。換句話說,它只是一個從啓動時創建的連接獲取數據庫句柄的調用。你可以多次調用它,它不會創建新的連接,只要你有請求就可以隨時調用它。在我看來,創建一個用戶來設置分貝並不是一件好事。 – 2012-07-28 22:06:34

回答

5

金字塔不會每個請求多次呼叫NewRequest。這種情況發生的唯一原因是您無意中多次註冊您的訂戶。人們認爲它被多次調用的另一個常見原因是,瀏覽器通常會使用一個favicon請求來處理請求,但這隻會佔用2次調用。您是否可以顯示任何輸出或更詳細地描述您的問題來說服我確定用戶真的被多次調用?

BeforeRender將被多次調用(每個模板呈現一次)。當啓用調試工具欄時,每個請求上都會顯示很多東西,但即使如此,30次聽起來也更像我期望的3倍。一般情況下,連接到你的數據庫不是一個好主意,因爲這個訂閱者也會被調用靜態資源(字面上是所有的請求)。更好的模式是通過config.set_request_propertyrequest對象上創建一個惰性/被指定屬性。這將在您首次在每個請求中使用數據庫時連接,並且在您不使用時不會影響性能。

+0

另請注意,任何其他靜態資源都會觸發NewRequest(至少在開發時)。那就是:js,css,圖片等。在初始請求之後,頁面加載其他幾個文件是正常的。在製作時,建議直接將這些文件提供給Web服務器,而不是將它們與應用程序一起提供。 – 2012-07-27 23:32:31

相關問題