为什么我需要str#u pad(';';,4096)`来让PHP刷新工作?

为什么我需要str#u pad(';';,4096)`来让PHP刷新工作?,php,flush,Php,Flush,比如说, 这不起作用(Firefox21,IE8): 但这一条有效: <?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<

比如说,

这不起作用(Firefox21,IE8):


但这一条有效:

<?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)。

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

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

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


编辑:哦,是的,浏览器(或者地狱,介于两者之间的一些路由器或TCP堆栈)也可以做到这一点。

一些浏览器包括自己的内部缓冲区,以便更高效地下载和显示,且不太频繁。在大多数情况下,该缓冲区为4Kb,即4096字节

str_pad(“”,4096)
所做的是将4096个空格写入输出。因为它是HTML,所以这些空间折叠成一个单独的空间

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


还有,你为什么要写

?没有end

标记,自动关闭版本是

对于慢速主机,请尝试以下操作:

$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.';
$totalUsers=count_users();
echo'There's'、$result['total_users']、'total users
; foreach($result['avail\u roles']作为$role=>count) echo',',$count'are',$role's'; 回声'; $batchSize=25; $batchesCount=ceil($totalUsers['total_users']/$batchSize); $Users=array(); 对于($count=0;$count<$batchesCount;$count++){ $args=array('number'=>$batchSize,'offset'=>$count*$batchSize); $batchNewUsers=获取用户($args); $Users=array\u merge($Users,$batchNewUsers); 睡眠(1);#减轻负荷 回显“.”。str_pad(“”,4096);#保持活力 } 回显“
全部完成”;
否则,最好直接查询数据库,或者先获取ID,然后按ID查询:

Lol,你说得对

。代码不是我的,但我应该看到它。“总的来说,这种行为不应该被依赖”。那么,我应该怎么做,使用AJAX?这完全取决于你想做什么。AJAX可能是一种方法,但实际上我需要更多地了解您在做什么来提出有效的建议。我希望PHP连接到一个有时速度较慢的主机(不是我的主机)来读取一些xml文件(每次它们都不同,我无法存储它们),并使用xpath获取一些数据。我想我可以使用
flush
从第一个xml发送数据,而它还没有读取第二个xml。。。缓慢的服务器是一个痛苦的工作。不过,你有没有使用过航班搜索网站?他们有一个加载屏幕,告诉你几分钟的时间,通常伴随着有用的链接和信息,如租车和酒店,你可以在等待时查看。你有没有办法做类似的事情?
$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.';