显示ZF2请求执行时间



我想在我的网站的每一页中打印请求执行时间,即ZF2中的页面。

我已经在index.php中定义了一个常量(这是请求访问的第一个文件),请求初始值为microtime(true)
现在,我应该在哪里获得请求的最终microtime(true)

我的计划是有这样的东西:

$executionTime = ($finalTime - $initialTime) / 1000000; // in seconds
$executionTime = number_format($executionTime, 2);

问题是,您可能希望将此信息添加到视图中(以便用户可以看到它),这意味着添加渲染视图之前的时间(MvcEvent::EVENT_RENDER之前)。但问题是,视图是在触发MvcEvent::EVENT_FINISH之前呈现的,因此时间不准确。这不容易解决。。。


您可以考虑在响应中添加一些与时间相关的标头。这里有一个关于添加自定义页眉的有趣的相关问题。

  • 例如,NGinx有一个$request_time变量,您可以使用开箱即用

    $request_time
    请求处理时间(以秒为单位),分辨率为毫秒(1.3.9、1.2.6);从客户端读取第一个字节后经过的时间

    add_header X-Request-Time $request_time always;
    
  • 还有一个Age响应头字段。您可以在RFC2616的Header字段定义部分14.6中找到它。

    Age响应标头字段传达发件人对自响应(或其重新验证)在源服务器上生成。如果它的年龄不会超过它的保鲜期。年龄值为按照第13.2.3节的规定进行计算。

    也许您可以使用它来计算在服务器上处理请求所花费的时间。

您也可以在ZF2应用程序中添加自定义标头,方法是向Module.php添加一些代码,如下所示:

function onBootstrap(MvcEvent $event) {
$application = $event->getApplication();
$eventManager = $application->getEventManager();
$eventManager->attach(MvcEvent::EVENT_FINISH, [$this, 'addTimeHeader']);
//...
}
function addTimeHeader(MvcEvent $event) {
$time = // get your time value
$response = $event->getResponse();
$response->getHeaders()->addHeaderLine('X-Request-Time', $time);
}

问题仍然是在您的视图中获取这些数据。如果您使用AJAX请求,那么很容易从响应中获取标头,但如果您不使用AJAX,那就完全不同了。请在此处阅读此答案中的更多内容。

为了在开发环境中实现您的要求,以及其他一些要求,您可以使用Zend Developer Tools模块,它将自动为您提供有关应用程序的一些信息。

在生产环境中,您可以监听MvcEvent::EVENT_FINITH,这是Zend框架MVC 发出的最后一个事件

如果你想成为一个真正肮脏的人,请在开始时添加你的index.php文件:

$_GET['the_time'] = round(microtime(true) * 1000);

在视图或布局打印中,无论您想在哪里:

echo round(microtime(true) * 1000) - $_GET['the_time'];
// Use $_GET as global variable 

注意:其他开发人员可能会讨厌你

我的解决方案是基于这个答案的。

我的每个视图都附有一个footer.phtml,所以如果我在那里打印它,就不需要更改很多文件。

为了在那里打印时间,首先我写了一些特定于footer.phtml的内容,例如Execution time:

module/Application/Module.php中,我将此代码添加到onBootstrap()

$eventManager->attach(ZendMvcMvcEvent::EVENT_FINISH, function($e) {
$time = microtime(true) - REQUEST_MICROTIME;
// formatting time to be more friendly
if ($time <= 60) {
$timeF = number_format($time, 2, ',', '.').'s'; // conversion to seconds
} else {
$resto  = fmod($time, 60);
$minuto = number_format($time / 60, 0);
$timeF = sprintf('%dm%02ds', $minuto, $resto); // conversion to minutes and seconds
}
// Search static content and replace for execution time
$response = $e->getResponse();
$response->setContent(str_replace(
'Execution time:', 'Execution time: '.$timeF, $response->getContent()));
}, 100000);

您可以在index.php中捕获变量的时间,然后使用register_shutdown_function打印以下时间差:

index.php

define('APP_START_TIME', microtime(true));
register_shutdown_function(function(){
echo 'Request time(sec): ' . number_format(microtime(true) - APP_START_TIME, 3);
});

最新更新