我有一个简单的彗星聊天。
JavaScript 通过长轮询发送 ajax 请求。当服务器在数据库中发现新消息时,它会应答并给出 JSON。接下来,JavaScript 再次发送请求。
JavaScript:
function cometConnect(){
$.ajax({
cache:false,
type:"get",
data:'ts='+ts,
url: urlBack,
async: true,
success: function (arr1) {
//work with JSON
//.....
},
complete:function(){
cometConnect(true);
nerr=false;
},
dataType: "text"
});
}
PHP
$flag=true;
$lastmodif = isset($_GET['ts']) ? $_GET['ts'] : 0;
while($flag){
$q=mysql_query("SELECT text, posterId,modified, fromUserId,toUserId, login FROM commonMessage WHERE modified>$lastmodif");
while($r=mysql_fetch_row($q)){
$flag=false;
//Prepare JSON... variable $resp
//.........
}
usleep(5000);
}
echo $resp;
问题如下:这个“while($flag)”可以执行很长时间(如果没有人发布消息)。因此,Apache 可以抛出异常(最大执行时间,有时是 502 Bad Gateway 或 Gateway Timeout)。
怎么解决呢?
使用 .htaccess 和“php_value max_execution_time 0”?
或者当服务器返回错误时简单地从 JavaScript 发送新请求(这会使获取消息变得更慢)?
或许,还有其他办法吗?