2015-05-08 32 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一个封闭方法。

除非应用程序处于维护模式,您可以看到(在这种情况下),它只是调用链中下一个具有(可能已更改)请求的中间件。