我想使用symfony2为我的应用程序创建一个状态页面,我想打印特定请求的执行时间(以及其他数据)。无论如何我都找不到这样做。
我知道我可以用以下方式跟踪代码部分的执行时间:
$starttime = microtime();
// do something
$duration = microtime() - $starttime;
但是由于显而易见的原因我不能将它放在控制器中,因为整个引导程序都不会被跟踪。此外,还不会包含渲染模板。
有没有办法尽可能接近脚本的总执行时间?
答案 0 :(得分:8)
我发现了一种我认为对我们的用例没问题的方法。我在web文件夹中创建了一个新文件performance.php,如下所示:
<?php
/**
* This file is only used for doing realtime performance measurement
* Right now only the microtime is calculated, but in the future the
* xhproof module could be used: http://de2.php.net/manual/en/book.xhprof.php
*
* MAKE SURE TO NOT USE THIS FILE IN PRODUCTION FOR OTHER STUFF THAN REAL TIME
* PERFORMANCE MEASUREMENT
*/
$GLOBALS['PerformanceTwigExtensionMicrotime'] = microtime(true);
require_once __DIR__.'/app.php';
我还注册了一个使用全局的枝条扩展并计算经过的时间:
<?php
namespace Acme\DemoBundle\Extension;
class PerformanceTwigExtension extends \Twig_Extension {
public function getFunctions() {
return array(
'performance_exectime' => new \Twig_Function_Method($this, 'getExecTime')
);
}
public function getExecTime() {
if (!isset($GLOBALS['PerformanceTwigExtensionMicrotime'])) {
return 0;
}
$durationInMilliseconds = (microtime(true) - $GLOBALS['PerformanceTwigExtensionMicrotime']) * 1000;
return number_format($durationInMilliseconds, 3, '.', '');
}
public function getName() {
return "performance_extension";
}
}
当我们想要进行一些性能测量时,我们可以简单地使用performance.php。模板调用该函数,然后可以显示执行时间:
{{ performance_exectime() }}
如果未设置开始时间,则输出0(例如,当使用正常的app.php时),因此在任何情况下都可以安全使用。另一方面,如果有人决定使用performance.php作为入口点,它不应该破坏任何东西,因为只有一个全局变量是不同的。
答案 1 :(得分:3)
自PHP 5.4起,我们可以microtime(true) - $_SERVER['REQUEST_TIME_FLOAT']
如何在Symfony2中使用:
src/AppBundle/Twig/AppExtension.php
<?php
namespace AppBundle\Twig;
class AppExtension extends \Twig_Extension
{
public function getFunctions()
{
return [
new \Twig_SimpleFunction('request_time', [$this, 'requestTime'], ['is_safe' => ['html']]),
];
}
public function requestTime($decimals = 3)
{
return number_format(microtime(true) - $_SERVER['REQUEST_TIME_FLOAT'], $decimals);
}
public function getName()
{
return 'app_extension';
}
}
在视图中:
<footer class="footer">
<div class="container">
<p class="text-muted">{{ request_time() }}s</p>
</div>
</footer>
app/config/services.yml
中的:
services:
app.twig_extension:
class: AppBundle\Twig\AppExtension
public: false
tags:
- { name: twig.extension }