Php 长轮询不';停不下来
我试图修改长轮询代码以适应我的情况。 我想从mysql中计算总数,如果数量发生变化(增加或减少),它会通知我 问题是while循环一直在循环。我怎样才能阻止它?只要总金额发生变化,我就需要得到通知Php 长轮询不';停不下来,php,mysql,long-integer,polling,Php,Mysql,Long Integer,Polling,我试图修改长轮询代码以适应我的情况。 我想从mysql中计算总数,如果数量发生变化(增加或减少),它会通知我 问题是while循环一直在循环。我怎样才能阻止它?只要总金额发生变化,我就需要得到通知 <?php include("db.php"); $result = mysql_query("SELECT sum( r ) as totalsum FROM (SELECT colA, colB, COUNT( * ) AS r FROM product GROUP BY productid
<?php
include("db.php");
$result = mysql_query("SELECT sum( r ) as totalsum FROM (SELECT colA, colB, COUNT( * ) AS r FROM product GROUP BY productid ) AS t");
while($row = mysql_fetch_array($result))
{
$old_totalsum = $row['totalsum'];
}
?>
<html>
<head>
<script src="http://code.jquery.com/jquery-latest.min.js" type="text/javascript"></script>
<script type="text/javascript" charset="utf-8">
var old_totalsum =<?php echo $old_totalsum; ?>;
function waitForMsg(){
$.ajax({
type: "GET",
url: "poll.php?old_totalsum=" + old_totalsum,
async: true,
cache: false,
success: function(data){
var json = "eval(+(" + data + ")+)";
if(json['msg'] != "") {
alert(data);
}
old_msg_id = json['old_msg_id'];
setTimeout('waitForMsg()',1000);
},
error: function(XMLHttpRequest, textStatus, errorThrown){
alert("error: " + textStatus + " (" + errorThrown + ")");
setTimeout('waitForMsg()',15000);
}
}); // end ajax
} //end waitformsg
$(document).ready(function(){
waitForMsg();
});
</script>
</head>
<body>
<div id="chat">
</div>
</body>
</html>
<----------------------------------------------------------->
poll.php
<----------------------------------------------------------->
<?php
include("db.php");
$old_totalsum = $_GET['old_totalsum'];
$result = mysql_query("SELECT sum( r ) as totalsum FROM (SELECT colA, colB, COUNT( * ) AS r FROM product GROUP BY productid ) AS t");
while($row = mysql_fetch_array($result))
{
$last_sum = $row['totalsum'];
}
while($last_sum < $old_totalsum || $last_sum > $old_totalsum)
while($last_sum <= $old_totalsum)
{
usleep(1000);
clearstatcache();
$result = mysql_query("SELECT sum( r ) as totalsum FROM (SELECT colA, colB, COUNT( * ) AS r FROM product GROUP BY productid ) AS t");
while($row = mysql_fetch_array($result))
{
$last_sum = $row['totalsum'];
//echo $last_sum;
//return;
}
}
$response = array();
$response['msg'] = 'new';
$response['old_msg_id'] = $last_sum;
echo json_encode($response);
?>
<------------------------------------------->
var old_totalsum=;
函数waitForMsg(){
$.ajax({
键入:“获取”,
url:“poll.php?old_totalsum=“+old_totalsum,
async:true,
cache:false,
成功:功能(数据){
var json=“eval(+(“+data+”)+”;
如果(json['msg']!=“”){
警报(数据);
}
old_msg_id=json['old_msg_id'];
setTimeout('waitForMsg()',1000);
},
错误:函数(XMLHttpRequest、textStatus、errorshown){
警报(“错误:+textStatus+”(“+ERRORSHOUND+”));
setTimeout('waitForMsg()',15000);
}
});//结束ajax
}//结束waitformsg
$(文档).ready(函数(){
waitForMsg();
});
poll.php
我期望这样的逻辑:
$latest_sum= -1;
// Loop until sum from DB is different from what was passed in
while( $latest_sum == -1 || $latest_sum!= $old_sum ){
$result = mysql_query("SELECT sum( r ) as totalsum FROM (SELECT colA, colB, COUNT( * ) AS r FROM product GROUP BY productid ) AS t");
while($row = mysql_fetch_array($result))
{
$lastest_sum = $row['totalsum'];
}
}
$response = array();
$response['msg'] = 'new';
$response['old_msg_id'] = $latest_sum;
echo json_encode($response);
如果更改需要很长时间,那么Apache(或者运行PHP的任何东西)可能会取消请求。这也将在数据库上运行大量查询,这是非常昂贵的
因此,最好将循环放在javascript中。它将调用一个函数,该函数只从数据库返回最新的总和。javascript应该在每个请求之间等待一秒或更长时间
如果数据库的性能仍然太差,那么php应该以某种方式每分钟缓存一次值并返回缓存的值。哪个
循环不退出?while($last_sum$old_totalsum)
噢,对不起,不行($last_sum while($last_sum)在我测试你的方法之前,我可以先问个问题吗无法退出?我假设$last\u sum将被更新并导致此条件中断。Dave我应该将代码放在哪里?我看到您将$last\u sum=-1;这将导致while循环始终为真,不是吗?那么这意味着它也将继续循环?哦..我只是再次测试,似乎条件是好的。但当我在index.php中运行时,它现在保持不变向我显示一个弹出框,该框来自if(json['msg']!=“”){alert(data);}行,现在情况正好相反。如果我更改数据库使数字变大或变小,它不会显示弹出框。如果我什么也不做,并且数字相同,它会一直弹出!!那么,我如何才能扭转这种情况???