我想在我的网站的每个页面中打印,这是在ZF2中,请求执行时间。
我已经使用请求初始化microtime(true)
在index.php(这是请求访问的第一个文件)中定义了一个常量。
现在,我应该在哪里获得最终请求microtime(true)
?
我的计划是这样的:
$executionTime = ($finalTime - $initialTime) / 1000000; // in seconds
$executionTime = number_format($executionTime, 2);
答案 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);
});