如何在循环输出之前打印for循环的时序?

时间:2011-10-09 15:52:47

标签: php microtime

我不知道标题是否正确,无论如何这里是我需要的:

这是我的代码:

$start = microtime();
$string = $_POST['string'];
$matches = $SQL->prepare("SELECT * FROM `users` WHERE `name` LIKE ?");
$matches->execute(array('%'.$string.'%'));

echo "Done in: " . round($_GLOBALS['time'], 4);
foreach($matches->fetchAll() as $match) {
    [..]
}
$end = microtime();
$time = $end - $start;

正如您所看到的,我正在测量查询的时间+显示记录,microtime()需要位于foreach的底部,但我需要显示测量的时间({{ 1}}变量)在foreach之前。正如你所看到的,我试图这样做:$time但它总是返回0(null)。

我该怎么办?

3 个答案:

答案 0 :(得分:1)

你应该这样做:

$start = microtime(true);
$string = $_POST['string'];
$matches = $SQL->prepare("SELECT * FROM `users` WHERE `name` LIKE ?");
$matches->execute(array('%'.$string.'%'));

$output = '';
foreach($matches->fetchAll() as $match) {
    $output .= $someText;
    [...]
}

$end = microtime(true);
$time = $end - $start;
echo "Done in: " . round($time, 4);
echo $output;

另外,请注意我使用true的可选参数,因为这会将时间作为十进制数而不是documentation states的两部分返回。

答案 1 :(得分:0)

afuzzyllama 的答案是使用变量的一种方式。您还可以捕获foreach循环的output into a bufferecho时间,然后从缓冲区输出:

$start = microtime();
$string = $_POST['string'];
$matches = $SQL->prepare("SELECT * FROM `users` WHERE `name` LIKE ?");
$matches->execute(array('%'.$string.'%'));

ob_start();
foreach($matches->fetchAll() as $match) {
    [..]
}
$table = ob_get_contents();
ob_end_clean();

$end = microtime();
$time = $end - $start;
echo "Done in: " . round($GLOBALS['time'], 4);
echo $table;

另外,我不知道你为什么在这里使用$GLOBALS['time']

答案 2 :(得分:-1)

难道你不能在foreach之前使用microtime计算时间吗? e.g。

$start = microtime();
$string = $_POST['string'];
$matches = $SQL->prepare("SELECT * FROM `users` WHERE `name` LIKE ?");
$matches->execute(array('%'.$string.'%'));

echo "Done in: " . (microtime() - $start);
foreach($matches->fetchAll() as $match) {
    [..]
}
$end = microtime();
$time = $end - $start;