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