PHP必须跟踪特定脚本用于强制执行max_execution_time限制的CPU时间量.
有没有办法在脚本内部访问这个?我想在我的测试中包含一些日志,记录实际PHP中有多少CPU被烧毁(当脚本处于等待数据库时,时间不会增加).
我正在使用Linux机器.
如果您只需要挂钟时间而不是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.
在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实例,则无需计算差异.
更短版本的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.