显示ZF2请求执行时间

时间:2016-06-09 20:58:08

标签: php zend-framework2

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

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

我的计划是这样的:

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

5 个答案:

答案 0 :(得分:3)

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

您可以考虑在回复中添加一些与时间相关的标头。 Here an interesting related question about adding your custom headers

  • 例如a $request_time variable for NGinx您可以使用开箱即用的

      

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

    add_header X-Request-Time $request_time always;
    
  • 还有一个Age响应标头字段。你可以找到它here in the Header Field Definitions section 14.6 in RFC2616

      

    Age response-header字段传达发件人的估计值   自响应(或其重新验证)以来的时间量   在原始服务器上生成。如果缓存响应是“新鲜的”   它的年龄不超过其新鲜寿命。年龄值是   按照第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,则完全不同。阅读更多here in this answer

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

如果你想变得非常脏,请在开头添加index.php文件:

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

在视图或版面打印中的任何位置:

{{1}}

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

答案 3 :(得分:0)

我的解决方案是this answer上基于

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

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

而不是module/Application/Module.php我将此代码添加到onBootstrap()

$eventManager->attach(\Zend\Mvc\MvcEvent::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);

答案 4 :(得分:0)

您可以在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);
});