jQuery和PHP中的无限循环.我应该做些什么来让它起作用呢?


Endless loop in jQuery and PHP. What should I change to make it work?

<?
if($_POST['begin'])
{
    while(1)
    {
        echo "1";
        sleep(2);
    }
    die();
}
?>
<span class="answerswer"></span>
<script type="text/javascript">
$(document).ready(function() {
        $.ajax({
            type: "POST",
            url: "exp.php",
            data: "begin=1",
            success: function(msg){
                $(".answer").html(msg);
            }
        })  
})
</script>

当然,它不起作用。我应该做些什么改变才能使它起作用?我可以避免使用setInterval, setTimeout或其他函数在javascript?

顺便说一下,我在这里要做的是每两秒钟写一次数字1

我从来没有尝试过,但是XMLHttpRequest接口应该支持流请求。特别是.readyState==3表示部分结果(参见规范http://www.w3.org/TR/XMLHttpRequest/#event-handler-attributes)。

当你不想设置间隔处理程序时,你将不得不重写实际的XHR回调,因为jQuery success:只会在完成时触发。

xmlHttp = $.ajax({ ... });
xmlHttp.onreadystatechange = function () {
    if (xmlHttp.readyState >= 3) {
        alert(xmlHttp.responseText);
    }
};

注意responseText将始终包含累积的数据。所以如果你想读最新的1,你必须把它分成'n或其他东西。

好的,我想我知道你想要什么了。这很奇怪……但好。

<script type="text/javascript">
$(document).ready(function() {
    function fetch_a_one() {
        $.ajax({
            type: "POST",
            url: "exp.php",
            data: "begin=1",
            success: function(msg){
                $(".answer").html(msg);
                fetch_a_one();
            }
        })
    }
    fetch_a_one();
})
</script>
<div class="answerswer"></div>
PHP脚本:

<?php
sleep(2); // way two seconds
exit(1); // print 1
?>

减去启动Ajax请求的一些延迟和服务器的延迟,这应该每2秒打印'1' ..不知道你为什么要这个

这是错误的方法,因为你的成功函数在收到服务器的响应之前不会运行,因为它在一个无限循环中不会发生。

你需要在JavaScript中使用setInterval来处理计时。当然,如果您想做的只是每五秒钟打印一个数字1,那么您不需要对服务器端进行任何调用(尽管我认为您最终想要实现的东西更多—您可能想要对此进行一点扩展)。

你可以考虑打开一个WebSocket返回到服务器来处理这种正在进行的通信。看看PusherApp - http://pusher.com/

您可能需要使用JavaScript。您可以不断地轮询服务器资源以从中获取信息,但实际的循环和延迟需要在JavaScript中实现。

这样做的原因是PHP脚本需要在某个时刻完成处理。它不是流输出到客户端,而是构建输出发送到客户端。在您提供的代码中,它永远在构建输出而从不发送输出。

您可以尝试从PHP脚本中刷新缓冲区,以便在构建更多输出的同时向客户机发送一些输出,但请查看该链接中的注意事项。这不是一个真正的干净的方法来完成这个任务,并且在这种情况下可能会导致比它解决的更多的问题。在某些时候,服务器资源需要停止处理并提交响应。试图短路HTTP的基本概念可能有点像黑客。

我认为问题是,你在写无休止的PHP循环。

jQuery在启动ajax请求时,会等待脚本完成他的工作。然而,脚本永远不会结束-所以浏览器永远不会得到完整的答案。

你需要使用setTimeout,没有其他的方法-至少没有其他简单和安全的方法。