Laravel 如何在JSON响应中添加API在Lumen framework中响应所需的执行时间

Laravel 如何在JSON响应中添加API在Lumen framework中响应所需的执行时间,laravel,lumen,Laravel,Lumen,我想在响应JSON中添加API响应所需的时间。目前正在开发带有流明框架的API 如果有人能用最好的方法指导。我不确定是否必须使用框架提供的任何挂钩,或者只是在routes文件中计算它们。以及如何将其推送到所有API响应 PS:仍在学习Laravel/Lumen框架 谢谢, Tanmay在目录public中,您有文件index.php。在其中创建一个变量: define('LUMEN_START', microtime()); 现在,在控制器中,您只需传递一个参数: return [ '

我想在响应JSON中添加API响应所需的时间。目前正在开发带有流明框架的API

如果有人能用最好的方法指导。我不确定是否必须使用框架提供的任何挂钩,或者只是在routes文件中计算它们。以及如何将其推送到所有API响应

PS:仍在学习Laravel/Lumen框架

谢谢,
Tanmay

在目录
public
中,您有文件
index.php
。在其中创建一个变量:

define('LUMEN_START', microtime());
现在,在控制器中,您只需传递一个参数:

return [
    'response_time' => microtime() - LUMEN_START
];

它将测量从开始(
public/index.php
是服务器运行的第一个文件)到响应的时间。

public/index.php
文件中,添加一个常量:

<?php

/*
|--------------------------------------------------------------------------
| Create The Application
|--------------------------------------------------------------------------
|
| First we need to get an application instance. This creates an instance
| of the application / container and bootstraps the application so it
| is ready to receive HTTP / Console requests from the environment.
|
*/

// To calculate your app execution time
define('LUMEN_START', microtime(true));

$app = require __DIR__.'/../bootstrap/app.php';

/*
|--------------------------------------------------------------------------
| Run The Application
|--------------------------------------------------------------------------
|
| Once we have the application, we can handle the incoming request
| through the kernel, and send the associated response back to
| the client's browser allowing them to enjoy the creative
| and wonderful application we have prepared for them.
|
*/

$app->run();
要在应用程序中启用此中间件,请添加:

$app->middleware([
   App\Http\Middleware\MeasureExecutionTime::class
]);
bootstrap/app.php
文件中。所以它是这样的:

<?php

require_once __DIR__.'/../vendor/autoload.php';

try {
    (new Dotenv\Dotenv(__DIR__.'/../'))->load();
} catch (Dotenv\Exception\InvalidPathException $e) {
    // n00p
}

/*
|--------------------------------------------------------------------------
| Create The Application
|--------------------------------------------------------------------------
|
| Here we will load the environment and create the application instance
| that serves as the central piece of this framework. We'll use this
| application as an "IoC" container and router for this framework.
|
*/

$app = new Laravel\Lumen\Application(
    realpath(__DIR__.'/../')
);

// $app->withFacades();

// $app->withEloquent();

/*
|--------------------------------------------------------------------------
| Register Container Bindings
|--------------------------------------------------------------------------
|
| Now we will register a few bindings in the service container. We will
| register the exception handler and the console kernel. You may add
| your own bindings here if you like or you can make another file.
|
*/

$app->singleton(
    Illuminate\Contracts\Debug\ExceptionHandler::class,
    App\Exceptions\Handler::class
);

$app->singleton(
    Illuminate\Contracts\Console\Kernel::class,
    App\Console\Kernel::class
);

/*
|--------------------------------------------------------------------------
| Register Middleware
|--------------------------------------------------------------------------
|
| Next, we will register the middleware with the application. These can
| be global middleware that run before and after each request into a
| route or middleware that'll be assigned to some specific routes.
|
*/

$app->middleware([
   App\Http\Middleware\MeasureExecutionTime::class
]);

// $app->middleware([
//    App\Http\Middleware\ExampleMiddleware::class
// ]);

// $app->routeMiddleware([
//     'auth' => App\Http\Middleware\Authenticate::class,
// ]);

/*
|--------------------------------------------------------------------------
| Register Service Providers
|--------------------------------------------------------------------------
|
| Here we will register all of the application's service providers which
| are used to bind services into the container. Service providers are
| totally optional, so you are not required to uncomment this line.
|
*/

// $app->register(App\Providers\AppServiceProvider::class);
// $app->register(App\Providers\AuthServiceProvider::class);
// $app->register(App\Providers\EventServiceProvider::class);

/*
|--------------------------------------------------------------------------
| Load The Application Routes
|--------------------------------------------------------------------------
|
| Next we will include the routes file so that they can all be added to
| the application. This will provide all of the URLs the application
| can respond to, as well as the controllers that may handle them.
|
*/

$app->group(['namespace' => 'App\Http\Controllers'], function ($app) {
    require __DIR__.'/../app/Http/routes.php';
});

return $app;

我使用Lumen 5.3并希望返回
JsonResponse
。因此,我不得不稍微修改一下Alfa的中间件解决方案:

而不是

// Change the content of your response
$response->setContent($content);
我用


不确定这是否与
JsonResponse
或Laravel/Lumen版本有关,但它对我有效。

我们应该在每个响应/控制器中添加
'response\u time'=>microtime()-Lumen\u START
。我更喜欢使用
中间件
作为全局解决方案。请阅读下面我的答案。为简单起见,这很好,但可能会与中间件解决方案一起使用,因此我不必为每个响应单独添加。感谢您的详细解释。注意:您应该将响应时间添加为标题,如X-response-time。这样,您就不用对响应进行解码和编码,从而节省了时间。它还适用于其他类型的内容:图像、html等
<?php

namespace App\Http\Middleware;

use Closure;

class MeasureExecutionTime
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $response = $next($request);

        $response->headers->set('X-Elapsed-Time', microtime(true) - LUMEN_START);

        return $response;
    }
}
// Change the content of your response
$response->setContent($content);
// Change the content of your response
$response->setData($content);