我目前正在制作一个PHP计时器,用于检查某种做某事的方式与另一种完成相同操作的方式相比,基本上是基准测试。
现在,我还想让这个工具能够分辨出具体执行方式占用了多少内存。
所以,有关更多信息,我正在使用microtime来检查开始时间,在该代码上做了2000万个循环,然后用一些数学做另一个微缩时间来检查花了多少时间,所以我想做什么是,在microtime范围之外,还检查内存使用情况。
这是我目前的代码:
// Set the amount of loops to do, default is 2000
$loops = 2000;
$start_time = microtime(true); // Start the timer
for($i = 0; $i < $loops; $i++) {
// Code to test
}
$total_time = microtime(true) - $start_time; // Stop the timer, and figure out the total
ob_end_flush(); // Enable output again
echo $total_time; // Echo the timer's result
?>
答案 0 :(得分:6)
如果你的成绩至少为5.2,memory_get_peak_usage()
应该可以正常工作。
http://php.net/manual/en/function.memory-get-peak-usage.php
你可以在循环之前调用它一次以了解你的基线直到那一点,然后再次查看循环执行期间的峰值。
修改代码......
// Set the amount of loops to do, default is 2000
$loops = 2000;
$base_mem = memory_get_peak_usage();
$start_time = microtime(true); // Start the timer
for($i = 0; $i < $loops; $i++) {
// Code to test
}
$end_time = microtime(true); // Stop the timer
$extra_mem = memory_get_peak_usage();
// figure out the totals
$total_time = $end_time - $start_time;
$total_mem = $extra_mem - $base_mem;
ob_end_flush(); // Enable output again
echo "Total Time: $total_time\n";
echo "Total Mem Above Basline: $total_mem bytes\n";
答案 1 :(得分:3)
当您认为流程达到顶峰时,您可以使用memory_get_usage
(http://php.net/manual/en/function.memory-get-usage.php)。
或者您也可以偶尔调用它并记录最高价值......或者您喜欢的。
但这是一个过程。你是在谈论PHP进程“A”检查另一个PHP进程的内存使用情况吗?
如果是这样的话:
$myPID = getmypid();
$stats = explode("\n", shell_exec('pmap $(pgrep php) | grep \'total\\|\\:\''));
for ($i = 0; $i < count($stats); $i += 2) {
if (strpos($stats[$i], "$myPID") === false) {
preg_match('/\d+/', $stats[$i+1], $preRes);
$res = $preRes[0];
}
}
//if $res has a value, that value is the kilobytes of memory being used by the other PHP process
此解决方案存在一个问题:如果您运行的PHP进程总数超过2个,则无法保证您将获得正确的进程。
要解决此问题,首先运行另一个进程,获取其PID,然后将其作为参数传递给此进程。如果你想要检查进程'PID,你可以这样做:
$stats = explode("\n", shell_exec('pmap $(pgrep php) | grep \'total\\|\\:\''));
for ($i = 0; $i < count($stats); $i += 2) {
if (strpos($stats[$i], "$otherPID") === 0) {
preg_match('/\d+/', $stats[$i+1], $preRes);
$res = $preRes[0];
}
}
//$res contains the result you want in kilobytes
您可以检查所有不属于您的进程的内存:
$myPID = getmypid();
$stats = explode("\n", shell_exec('pmap $(pgrep php) | grep \'total\\|\\:\''));
for ($i = 0; $i < count($stats) - 1; $i += 2) {
if (strpos($stats[$i], "$myPID") === false) {
preg_match('/\d+/', $stats[$i+1], $preRes);
$res[] = $preRes[0];
}
}
因此,要获得最大内存使用量,只需保留$ max变量并继续检查它。