2015-05-08 33 views
2

我的應用程序有幾個中間件可以在每個請求上運行。Laravel 5很多中間件和性能

我想知道有許多中間件的性能影響。它只是一個函數調用,或者當一箇中間件傳遞給另一箇中間件時,它正在執行HTTP重定向。

我有可能將所有中間件都加入到單箇中間件中,但爲了模塊化,我將中間件分開以執行特定任務。

回答

0

中間件只是一段在每個請求上執行的代碼。據我所知,它不會干擾你的請求週期,就像創建HTTP重定向一樣,除非你的中間件明確地這樣做了。中間件執行最基本的流程是

request -> middleware-1 -> middleware-2 ... middleware-N -> controller action -> response 

從邏輯上講,當您添加更多的中間件,更多的代碼能夠順利通過每一個請求執行,從而是的,我認爲這可能會影響應用程序的性能,但要找出到底有多大的影響是的,你將不得不使用中間件來對你的代碼進行基準測試。此外,中間件可幫助您過濾請求。如果某個中間件停止了將請求傳播到應用程序中的進程,那麼只需執行很少的代碼,因此您還必須記住並非所有請求都執行相同數量的代碼。換句話說,在上圖中,如果中間件-1中的某個條件失敗,其餘的中間件加控制器代碼甚至不會執行,並且響應立即返回。

至於每個中間件都有專門的對象,我會說是的,這應該是你的方法,因爲Laravel 5的架構鼓勵這樣做,它也使得你的中間件模塊化(可在其他應用程序中重用)。

+0

謝謝。一旦我有更多的空閒時間,我會做一些基準測試。 – Yada

1

我正要通過中間件文檔和我創辦這個:

HTTP中間件進入您的應用程序過濾HTTP請求提供一個方便的機制。例如,Laravel包含一箇中間件,用於驗證應用程序的用戶是否已通過身份驗證。如果用戶未通過身份驗證,則中間件會將用戶重定向到登錄屏幕。但是,如果用戶通過身份驗證,中間件將允許請求繼續進入應用程序。

根據我,它不會每次都重定向,除非和直到出現故障。所以,據我說,不會有性能問題。

0

中間件只是一個函數調用的遞歸鏈。第一個中間件調用第二個調用第三個的中間件,依此類推。

如果其中一箇中間件選擇重定向或其他請求破壞性操作,則鏈終止。 (例如,如果用戶未通過身份驗證,身份驗證中間件將重定向)

如果沒有任何中間件斷開鏈,遞歸尾部會回滾並且請求會繼續進入應用程序。

編輯: 下面是一箇中間件的一個很簡單的例子:https://github.com/laravel/framework/blob/5.0/src/Illuminate/Foundation/Http/Middleware/CheckForMaintenanceMode.php#L35

public function handle($request, Closure $next) 
{ 
    if ($this->app->isDownForMaintenance()) 
    { 
     throw new HttpException(503); 
    } 
    return $next($request); 
} 

你看處理方法獲得的$request作爲參數,並指向$next中間件的handle一個封閉方法。

除非應用程序處於維護模式,您可以看到(在這種情況下),它只是調用鏈中下一個具有(可能已更改)請求的中間件。