【发布时间】:2014-06-18 18:48:08
【问题描述】:
抱歉,如果该主题已经存在,但我找不到解决方案。我在服务器端处理了一些计算。这些计算包括几个步骤。我想对每个执行的步骤做出响应。例如,一个任务有 5 个步骤,服务器必须向我发送 5 个响应:
- 执行第 1 步
- 执行第 2 步
- 执行第 3 步
- ...等
我阅读了很多论坛和博客,但我无法解决这个问题。就我而言,我认为在彗星中使用长轮询会更好。我写了一个简单的任务示例(发布在下面);它不起作用。这个任务有按钮启动计数器(从 1 到 11,睡眠 1 秒),然后 Ajax 发送请求。服务器必须给出累积的文本($q_msg),清除这个变量,并继续累积另一个计数。但不是这样,服务器会在没有任何响应的情况下累积所有内容,并最终将响应全部放在答案中。那么,我的错在哪里?请帮帮我。
HTML:
<script type="text/javascript">
var request;
function createXMLRequest() {
request = new XMLHttpRequest();
return request;
}
//start counter
function comet_btnStart() {
document.getElementById('count1').innerHTML = "";
createXMLRequest();
var param = "btnStart=pusk";
request.open("GET", "counter.php?" + param, true);
request.onreadystatechange = comet_response;
request.send(null);
}
//get values
var q = "";
function comet() {
createXMLRequest();
var param = "q=" + q;
request.open("GET", "counter.php?" + param, true);
request.onreadystatechange = comet_response;
request.send(null);
}
function comet_response() {
if (request.readyState === 4)
{
if (request.status === 200)
{
if (request.responseText !== null)
{
var text = request.responseText;
if (text === "end") document.getElementById('count1').innerHTML += "<br/>Task is executed";
else
{
var result = text.split(",");
q = result[result.length-1];
document.getElementById('count1').innerHTML += "<br/>" + request.responseText;
setTimeout(comet, 2000);
}
}
else document.getElementById('count1').innerHTML += "<br/>No response";
}
else document.getElementById('count1').innerHTML += "<br/>Invalid connection";
}
}
</script>
</head>
<body>
<div>
Click button to start counter: <input type="button" value="Начать" name="btnStart" id="btnStart" onclick="comet_btnStart()" /><br/><br/>
Counts:<br/> <span id='count1' style='color: #246499; font-weight: bold'></span>
</div>
</body>
PHP:
<?php
if (isset($_GET['btnStart']))
{
$q_msg = "";
$q = 0;
logic::counter();
echo $q_msg;
$q_msg = "";
}
if (isset($_GET['q']))
{
$lastq = $_GET['q'];
global $q;
if ($lastq < $q)
{
echo $q_msg;
$q_msg = "";
}
else echo "end";
}
class logic
{
static function counter()
{
global $q;
while ($q <= 10)
{
sleep(1);
$q++;
global $q_msg;
if (strlen($q_msg) > 0) $q_msg .= ", " . $q;
else $q_msg = $q;
//just for debugging
echo $q_msg; //why server doesn't send data???
}
}
}
【问题讨论】:
标签: javascript php comet long-integer polling