Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/268.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无休止的while循环混乱_Php_While Loop - Fatal编程技术网

PHP无休止的while循环混乱

PHP无休止的while循环混乱,php,while-loop,Php,While Loop,我正在试图弄清楚为什么这个循环不向浏览器返回任何内容: while(1) { echo "hello"; flush(); sleep(1); } 我希望它每秒都能在浏览器上回复“你好”。。。我错了吗?现在页面似乎挂起了。在收到整个页面之前,浏览器不会显示任何内容。PHP无法实现您想要实现的目标 在Javascript中,这非常简单 <script> window.setInterval(function(){document.innerHTML +

我正在试图弄清楚为什么这个循环不向浏览器返回任何内容:

while(1) {
    echo "hello";
    flush();
    sleep(1);
}

我希望它每秒都能在浏览器上回复“你好”。。。我错了吗?现在页面似乎挂起了。

在收到整个页面之前,浏览器不会显示任何内容。PHP无法实现您想要实现的目标

在Javascript中,这非常简单

<script>
    window.setInterval(function(){document.innerHTML += "<br> Hello"}, 1000)
</script>

setInterval(函数(){document.innerHTML+=“
Hello”},1000)
在收到整个页面之前,浏览器不会显示任何内容。PHP无法实现您想要实现的目标

在Javascript中,这非常简单

<script>
    window.setInterval(function(){document.innerHTML += "<br> Hello"}, 1000)
</script>

setInterval(函数(){document.innerHTML+=“
Hello”},1000)
PHP仅在执行完成后输出。因此,您所做的一切就是每毫秒生成一个新的hello,因为您从未退出循环,所以您永远看不到输出。

PHP仅在执行完成后输出。因此,您所做的一切就是每毫秒生成一个新的hello,而且由于您从未退出循环,因此您永远看不到输出。

您应该意识到,PHP是一种脚本语言,它只在完成脚本后才返回输出。编辑:或者在填充输出缓冲区后,谢谢@Marc B。 不管怎样,我认为使用JS更明智,或者如果您真的需要您的服务器,请使用AJAX请求

也许你应该考虑使用JavaScript?这将允许您每秒添加内容(请记住,JS是在客户端运行的,因此您可能不想让您的操作变得如此膨胀。)


可选地,您可以考虑通过jjQuery使用Ajax请求,但这可能超出了这个问题的范围。

您应该意识到PHP是一种脚本语言,因为它在完成脚本后才返回输出。编辑:或者在填充输出缓冲区后,谢谢@Marc B。 不管怎样,我认为使用JS更明智,或者如果您真的需要您的服务器,请使用AJAX请求

也许你应该考虑使用JavaScript?这将允许您每秒添加内容(请记住,JS是在客户端运行的,因此您可能不想让您的操作变得如此膨胀。)


可选地,您可以考虑通过jjQuery使用Ajax请求,但是这可能超出了这个问题的范围…

添加到所有其他答案,


要执行异步服务器推送到客户端,您需要使用WebSocket。这是一个广泛的主题,并没有完全标准化,但肯定有办法做到这一点。如果您有兴趣搜索PHP WebSocket。

添加到所有其他答案中


要执行异步服务器推送到客户端,您需要使用WebSocket。这是一个广泛的主题,并没有完全标准化,但肯定有办法做到这一点。如果您感兴趣,请搜索PHP WebSocket。

回答可能不会太晚,但如果您想每秒钟刷新一次,我给您一个示例:

<?php
echo "Flushing every second ...\n";
flush( );
$seconds = array (0,1,2,3,4,5,6,7,8,9);

foreach ($seconds as $second):
    echo $second . "\n";
    sleep( 1 );
    @ob_flush( ); flush( );
endforeach;
echo 'I flashed 10 second :P';

回答可能不会太晚,但如果你想在这里分秒必争,我给你一个示例:

<?php
echo "Flushing every second ...\n";
flush( );
$seconds = array (0,1,2,3,4,5,6,7,8,9);

foreach ($seconds as $second):
    echo $second . "\n";
    sleep( 1 );
    @ob_flush( ); flush( );
endforeach;
echo 'I flashed 10 second :P';

更正我的答案,让您更好地理解,对于AJAX爱好者来说。。。
在那里你需要额外的钱。。“ob_uuu”一词:

<?php
while( 1 ):
    echo "hello";
    ob_flush( ); flush();
    sleep( 1 );
endwhile;

更正我的答案,让您更好地理解,对于AJAX爱好者来说。。。
在那里你需要额外的钱。。“ob_uuu”一词:

<?php
while( 1 ):
    echo "hello";
    ob_flush( ); flush();
    sleep( 1 );
endwhile;
给了你正确的答案(投票给他/接受他的答案!),但没有解释原因。解释如下:

输出缓冲 PHP不会立即输出到浏览器,而是等待有一定量的内容发送到浏览器(可能是以1024、2048或4096字节的块发送),或者在执行结束时发送。调用
flush()
可以让PHP发送数据,但缓冲层不止一层。一个是内部缓冲(我刚刚评论过),但是您可以添加更多的缓冲层。假设此代码:

<?php
echo "hi";
setcookie('mycookie', 'somevalue');
?>
您的PHP服务器可能默认启用了输出缓冲。请参阅以在默认情况下关闭/打开它。

给了您正确的答案(投票给他/接受他的答案!),但没有解释原因。解释如下:

输出缓冲 PHP不会立即输出到浏览器,而是等待有一定量的内容发送到浏览器(可能是以1024、2048或4096字节的块发送),或者在执行结束时发送。调用
flush()
可以让PHP发送数据,但缓冲层不止一层。一个是内部缓冲(我刚刚评论过),但是您可以添加更多的缓冲层。假设此代码:

<?php
echo "hi";
setcookie('mycookie', 'somevalue');
?>

您的PHP服务器可能默认启用了输出缓冲。查看默认情况下关闭/打开的选项。

好的,Carlos批评我,因为我没有解释我的答案,但他的答案很模糊。。。用饼干,分层。。职位,职位级别…:OO提供了很多关于用户真正问题的信息,但是我会告诉你为什么你的代码不起作用。因为您已经在php.ini中设置了输出缓冲,如下所示:

output_buffering = On
while (@ob_end_clean( ));

这就是为什么您需要额外的“ob_flush()”,以清除任何垃圾输出

所以。。。要使代码正常工作,您有两个选项:

1). set output_buffering = 0 or Off (if you have access to the php.ini)
2). ob_flush many times as layers of buffering you have
如果您不知道有多少层,可以执行以下操作:

output_buffering = On
while (@ob_end_clean( ));
然后清理你所有的垃圾,然后你的代码就可以正常工作了。。 完成snipp:

<?php
while (@ob_end_clean( ));
while(1) {
    echo "hello";
    flush();
    sleep(1);
}

好吧,卡洛斯批评我,因为我没有解释我的答案,但他的答案很模糊。。。用饼干,分层。。职位,职位级别…:OO提供了很多关于用户真正问题的信息,但是我会告诉你为什么你的代码不起作用。因为您已经在php.ini中设置了输出缓冲,如下所示:

output_buffering = On
while (@ob_end_clean( ));

这就是为什么您需要额外的“ob_flush()”,以清除任何垃圾输出

所以。。。要使代码正常工作,请执行以下操作: