为什么我需要`str_pad('',4096)`来使PHP刷新工作?

时间:2013-01-29 01:54:41

标签: php flush

例如,

这不起作用(Firefox 21,IE8):

<?php
function flush_buffers(){
    ob_end_flush();
    ob_flush();
    flush();
    ob_start();
}  
ob_start();
echo 'Text 1<br />';
flush_buffers();
Sleep(2);
echo 'Text 2<br />';
flush_buffers();
Sleep(2);
echo 'Text 3<br />';
flush_buffers();
Sleep(2);
echo 'Text 4<br />';
?>

但是这个有效:

<?php
function flush_buffers(){
    echo str_pad('',4096);
    ob_end_flush();
    ob_flush();
    flush();
    ob_start();
}  
ob_start();
echo 'Text 1<br />';
flush_buffers();
Sleep(2);
echo 'Text 2<br />';
flush_buffers();
Sleep(2);
echo 'Text 3<br />';
flush_buffers();
Sleep(2);
echo 'Text 4<br />';
?>

我在Win XP SP3上运行PHP 5.4.11 VC9和Apache 2.4.3(apacheLounge)。

4 个答案:

答案 0 :(得分:5)

某些浏览器包含自己的内部缓冲区,以便更低效地下载和显示。在大多数情况下,此缓冲区为4Kb或4096字节。

str_pad('',4096)做的是向输出写入4,096个空格。由于它是HTML,因此这些空间会折叠成一个空格。

总的来说,不应该依赖这种行为。浏览器用于查看网页,而不是混淆到控制台终端。

另外,你为什么写</br>?没有结束<br>标记,自结案版本为<br />

答案 1 :(得分:1)

除了指定浏览器版本之外,您还应该指定运行PHP的Web服务器。毕竟,这就是输出缓冲可能发生的地方。

如果您阅读documentation on flush,您会发现这不是保证操作。有点像磁盘写入,即使你有库和操作系统合作,仍然有磁盘硬件(可能)缓冲它。只有最细致(因此也不可能移植到端口)的方法才能起作用,甚至不能保证。

编辑:哦,是的,浏览器(或地狱,某些路由器或其间的TCP堆栈)也可以做到。

答案 2 :(得分:0)

这是因为浏览器的渲染引擎在决定将内容呈现给屏幕时需要获取足够的数据。需要多少数据是由浏览器决定的。

答案 3 :(得分:0)

对于缓慢托管,尝试这样的事情:

$totalUsers = count_users();

echo 'There are ', $result['total_users'], ' total users<br />';
foreach($result['avail_roles'] as $role => $count)
    echo ', ', $count, ' are ', $role, 's';
echo '.';

$batchSize = 25;
$batchesCount = ceil($totalUsers['total_users'] / $batchSize);
$Users = array();
for ($count = 0; $count < $batchesCount; $count++) {
$args = array('number' => $batchSize, 'offset' => $count * $batchSize);
    $batchNewUsers = get_users($args);
    $Users = array_merge($Users, $batchNewUsers);
    sleep(1); # reduce load
    echo '.'.str_pad(' ',4096);# keep alive
}

echo '<br />All done.';

另外,您可能更好直接查询数据库,或首先获取ID并按ID查询每个ID: https://wordpress.stackexchange.com/questions/231003/how-to-get-list-of-all-users-there-metadata