Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 回声&x27;字符串';而每次长循环迭代(flush()不工作)_Php - Fatal编程技术网

Php 回声&x27;字符串';而每次长循环迭代(flush()不工作)

Php 回声&x27;字符串';而每次长循环迭代(flush()不工作),php,Php,我有一个需要很长时间才能执行的循环,我希望脚本在循环迭代完成时显示一些内容 echo "Hello!"; flush(); for($i = 0; $i < 10; $i ++) { echo $i; //5-10 sec execution time flush(); } echo“你好!”; 冲洗(); 对于($i=0;$i

我有一个需要很长时间才能执行的循环,我希望脚本在循环迭代完成时显示一些内容

echo "Hello!";

flush();

for($i = 0; $i < 10; $i ++) {
    echo $i;
    //5-10 sec execution time
    flush();
}
echo“你好!”;
冲洗();
对于($i=0;$i<10;$i++){
echo$i;
//5-10秒执行时间
冲洗();
}

在整个脚本完成之前,不会显示回声。出了什么问题?

您也可以尝试使用ob_flush(),有时两者都需要工作。

来自PHP手册:

flush()可能无法覆盖web服务器的缓冲方案,并且对浏览器中的任何客户端缓冲都没有影响。它也不会影响PHP的用户空间输出缓冲机制。这意味着您必须调用ob_flush()和flush()来刷新ob输出缓冲区(如果您正在使用这些缓冲区)

echo "Hello!";
flush();
ob_flush();

for($i = 0; $i < 10; $i ++) {
    echo $i;
    //5-10 sec execution time
    flush();
    ob_flush();
}
echo“你好!”;
冲洗();
ob_flush();
对于($i=0;$i<10;$i++){
echo$i;
//5-10秒执行时间
冲洗();
ob_flush();
}
-或者-您可以刷新并关闭缓冲

<?php
//Flush (send) the output buffer and turn off output buffering
while (ob_get_level() > 0)
    ob_end_flush();

echo "Hello!";

for($i = 0; $i < 10; $i ++) {
    echo $i . "\r\n";
}

?>

通常,使用纯PHP和HTML的确定性/稳定方式不可能实现所需的行为

浏览器是否以及如何呈现部分页面取决于浏览器、代理和缓存。因此,即使这些东西在您的测试机器上工作,也很可能在您的生产系统上不工作

该库提供了一个集成良好的解决方案,用PHP管理AJAX风格的更新。虽然xAjax作为一个项目可能已经死了(至少现在是这样),但它仍然可以正常工作。

试试这个

while (@ob_end_flush());      
ob_implicit_flush(true);

echo "first line visible to the browser";
echo str_pad("",1024," ");
echo "<br />";

sleep(5);

echo "second line visible to the browser after 5 secs";
while(@ob_end_flush());
ob_隐式_刷新(真);
回显“浏览器可见的第一行”;
echo str_焊盘(“,1024,”);
回声“
”; 睡眠(5); echo“浏览器在5秒后可以看到第二行”;

请注意,这种方式实际上是禁用当前脚本的输出缓冲区。因此,如果在此之后尝试“ob_end_flush()”,您将收到一条警告,说明没有要关闭的缓冲区。

请确保首先执行以下操作:

@ini\u集('zlib.output\u compression',0);
@ini_集(“隐式_刷新”,1);
@ob_end_clean()


然后就是
flush()每次需要将回音输出到浏览器时。

还要确保先输出内容类型标题。如果没有:

header( 'Content-type: text/html; charset=utf-8' );
for($i=0; $i<10; ++$i)  {
    echo "Loop<br />\n";
    ob_flush();
    flush();
    sleep(1);
}
标题('Content-type:text/html;charset=utf-8');

对于($i=0;$i将此添加到脚本的标题上:

ob_start();
ob_implicit_flush();
隐式刷新将在每次输出调用后导致刷新操作,因此不再需要对flush()进行显式调用。 请注意,在脚本执行中添加隐式刷新会影响性能。您可以为脚本添加调试模式,如:

ob_start();
define(DEBUG, 1);

if(DEBUG){
    ob_implicit_flush();
}
关于如何让工作变得富有的各种建议。以下是解决方案-