当前位置:  开发笔记 > 编程语言 > 正文

在PHP中跟踪脚本执行时间

如何解决《在PHP中跟踪脚本执行时间》经验,为你挑选了10个好方法。

PHP必须跟踪特定脚本用于强制执行max_execution_time限制的CPU时间量.

有没有办法在脚本内部访问这个?我想在我的测试中包含一些日志,记录实际PHP中有多少CPU被烧毁(当脚本处于等待数据库时,时间不会增加).

我正在使用Linux机器.



1> 小智..:

如果您只需要挂钟时间而不是CPU执行时间,那么计算起来很简单:

//place this before any script you want to calculate time
$time_start = microtime(true); 

//sample script
for($i=0; $i<1000; $i++){
 //do anything
}

$time_end = microtime(true);

//dividing with 60 will give the execution time in minutes otherwise seconds
$execution_time = ($time_end - $time_start)/60;

//execution time of the script
echo 'Total Execution Time: '.$execution_time.' Mins';
// if you get weird results, use number_format((float) $execution_time, 10) 

请注意,这将包括PHP等待外部资源(如磁盘或数据库)的时间,这些资源不用于max_execution_time.


嗨 - 这跟踪'挂钟时间' - 而不是CPU时间.
完美,我一直在寻找一个挂钟时间跟踪解决方案.

2> phihag..:

在unixoid系统上(以及在Windows上的php 7+中),您可以使用getrusage,例如:

// Script start
$rustart = getrusage();

// Code ...

// Script end
function rutime($ru, $rus, $index) {
    return ($ru["ru_$index.tv_sec"]*1000 + intval($ru["ru_$index.tv_usec"]/1000))
     -  ($rus["ru_$index.tv_sec"]*1000 + intval($rus["ru_$index.tv_usec"]/1000));
}

$ru = getrusage();
echo "This process used " . rutime($ru, $rustart, "utime") .
    " ms for its computations\n";
echo "It spent " . rutime($ru, $rustart, "stime") .
    " ms in system calls\n";

请注意,如果要为每个测试生成一个php实例,则无需计算差异.


只需添加一个小更新:Windows上现在也支持此功能.

3> C. Lee..:

更短版本的talal7860的答案



正如所指出的,这是'挂钟时间'而不是'cpu时间'



4> joan16v..:

最简单的方法:


这与talal7860的答案有什么不同?

5> Joyal..:



6> Hamid Tavako..:

我创建了一个可以在开箱即用的phihag答案中使用的ExecutionTime类:

class ExecutionTime
{
     private $startTime;
     private $endTime;

     public function start(){
         $this->startTime = getrusage();
     }

     public function end(){
         $this->endTime = getrusage();
     }

     private function runTime($ru, $rus, $index) {
         return ($ru["ru_$index.tv_sec"]*1000 + intval($ru["ru_$index.tv_usec"]/1000))
     -  ($rus["ru_$index.tv_sec"]*1000 + intval($rus["ru_$index.tv_usec"]/1000));
     }    

     public function __toString(){
         return "This process used " . $this->runTime($this->endTime, $this->startTime, "utime") .
        " ms for its computations\nIt spent " . $this->runTime($this->endTime, $this->startTime, "stime") .
        " ms in system calls\n";
     }
 }

用法:

$executionTime = new ExecutionTime();
$executionTime->start();
// code
$executionTime->end();
echo $executionTime;

注意:在PHP 5中,getrusage函数仅适用于Unix-oid系统.从PHP 7开始,它也适用于Windows.


注意:在Windows上,"getrusage"仅适用于PHP 7.
我想如果您将开始放在构造函数中,然后放在tostring结束,则每次使用都需要少两行代码。面向对象的+1

7> 小智..:

developerfusion.com上的Gringod给出了这个很好的答案:

 
 






来自(http://www.developerfusion.com/code/2058/determine-execution-time-in-php/)



8> danieltalsky..:

最便宜和最脏的方法就是microtime()在您想要进行基准测试的代码中的地方拨打电话.在数据库查询之前和之后立即执行,并且很容易从脚本执行的其余时间中删除这些持续时间.

提示:您的PHP执行时间很少会使您的脚本超时.如果脚本超时,它几乎总是调用外部资源.

PHP microtime文档:http: //us.php.net/microtime



9> Stewart Robi..:

我想你应该看看xdebug.分析选项将使您了解许多与过程相关的项目.

http://www.xdebug.org/



10> Sinan Eldem..:

如果您将秒输出格式化为更漂亮,那将会更漂亮:

echo "Process took ". number_format(microtime(true) - $start, 2). " seconds.";

将打印

Process took 6.45 seconds.

这要好得多

Process took 6.4518549156189 seconds.

推荐阅读
个性2402852463
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有