我的应用程序有一些中间件可以在每个请求上运行。
我想知道拥有许多中间件对性能的影响。它只是一个函数调用,还是在一个中间件传递给另一个中间件时进行HTTP重定向。
我可以将所有中间件加入到单个中间件中,但为了模块化,我将中间件分离以执行特定任务。
答案 0 :(得分:1)
我刚刚浏览了中间件文档,我创建了这个:
HTTP中间件提供了一种方便的机制,用于过滤进入应用程序的HTTP请求。例如,Laravel包含一个中间件,用于验证应用程序的用户是否经过身份验证。如果用户未经过身份验证,则中间件会将用户重定向到登录屏幕。但是,如果用户通过身份验证,则中间件将允许请求继续进入应用程序。
并且根据我的说法,除非并且直到条件失败,否则它不会每次都重定向。因此,根据我的说法,我们不会遇到性能问题。
答案 1 :(得分:0)
中间件只是在每个请求上执行的一段代码。据我所知,它不会像创建HTTP重定向一样干扰您的请求周期,除非您的中间件明确地这样做。中间件执行的最基本流程是
configuration.yml
逻辑上,随着您添加更多中间件,每次请求都会执行更多代码,所以是的,我认为它可能会影响您的应用程序性能,但要确切地了解其影响程度,您必须使用和不使用代码对代码进行基准测试中间件。此外,中间件可帮助您过滤请求。如果某个中间件阻止请求进一步传播到您的应用程序中,则执行的代码非常少,因此您还必须记住并非所有请求都执行相同数量的代码。换句话说,在上图中,如果某个条件在中间件-1中失败,则中间件和控制器代码的其余部分甚至不会被执行,并且会立即返回响应。
至于为每个中间件设置专门的对象,我会说是的,这应该是你的方法,因为Laravel 5的架构鼓励它,它也使你的中间件模块化(在其他应用程序中可重用)。
答案 2 :(得分: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);
}
您会看到handle方法将$request
作为参数,并将Closure指向$next
中间件的handle
方法。
除非应用程序处于维护模式,否则您可以看到(在这种情况下),它只是使用(可能已更改的)请求调用链中的下一个中间件。