Laravel 5 много междинен софтуер и производителност

Моето приложение има няколко мидълуера, които се изпълняват при всяка заявка.

Чудя се въздействието върху производителността от наличието на много междинен софтуер. Дали това е просто извикване на функция или прави HTTP пренасочване, когато един междинен софтуер премине към друг.

Възможно е да обединя всички междинни софтуери към един междинен софтуер, но за модулност отделих междинния софтуер, за да изпълнява конкретна задача.


person Yada    schedule 08.05.2015    source източник


Отговори (3)


Тъкмо разглеждах документите на Middleware и открих това:

HTTP междинният софтуер предоставя удобен механизъм за филтриране на HTTP заявки, влизащи във вашето приложение. Например Laravel включва междинен софтуер, който проверява, че потребителят на вашето приложение е удостоверен. Ако потребителят не е удостоверен, междинният софтуер ще го пренасочи към екрана за вход. Въпреки това, ако потребителят е удостоверен, междинният софтуер ще позволи на заявката да продължи по-нататък в приложението.

и според мен не пренасочва всеки път, освен ако и докато има повреда в условието. Така че според мен няма да има проблем с производителността.

person Gaurav Dave    schedule 08.05.2015

Мидълуерът е просто част от кода, който се изпълнява при всяка заявка. Доколкото знам, това не пречи на вашия цикъл на заявка, както при създаването на HTTP пренасочвания, освен ако вашият междинен софтуер не прави това изрично. Най-основният поток за изпълнение на мидълуер е

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

Логично, докато добавяте повече мидълуер, повече код се изпълнява при всяка заявка, така че да, мисля, че това може да повлияе на производителността на вашето приложение, но за да разберете колко точно е въздействието, ще трябва да сравните кода си със и без мидълуер. Освен това междинният софтуер ви помага да филтрирате заявките. Ако определен междинен софтуер спре заявката да се разпространи по-нататък във вашето приложение, се изпълнява много малко код, така че трябва също да имате предвид, че не всички заявки изпълняват същото количество код. С други думи, на горната фигура, ако определено условие е неуспешно в мидълуер-1, останалата част от мидълуера плюс кода на контролера дори не се изпълнява и отговорът се връща незабавно.

Що се отнася до наличието на специализирани обекти за всеки мидълуер, бих казал да, това трябва да е вашият подход, тъй като архитектурата на Laravel 5 насърчава това и също така прави вашия мидълуер модулен (повторно използваем в други приложения).

person Noman Ur Rehman    schedule 08.05.2015
comment
Благодаря. щом имам повече свободно време, ще направя сравнителен анализ. - person Yada; 08.05.2015

Мидълуерите са просто рекурсивна верига от извиквания на функции. Първият междинен софтуер извиква втория, който извиква третия и т.н.

Ако един от мидълуерите избере пренасочване или някакво друго разрушително за заявката действие, веригата се прекратява. (Например мидълуерът за удостоверяване ще пренасочи, ако потребителят не е удостоверен)

Ако никой от междинните софтуери не прекъсне веригата, рекурсивната опашка се връща обратно и заявката се пристъпва към приложението.

Редактиране: Ето един много прост пример за междинен софтуер: 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);
}

Виждате, че методът handle получава $request като аргумент и Closure, който сочи към handle метода на $next средния софтуер.

Можете да видите, че (в този случай), освен ако приложението не е в режим на поддръжка, то просто извиква следващия среден софтуер във веригата с (евентуално променената) заявка.

person Peter    schedule 08.05.2015