PHP Comet。怎么做得更好?

时间:2011-02-18 08:28:21

标签: php javascript jquery chat comet

我有一个简单的彗星聊天。 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可以抛出exeptions(最长执行时间,有时502 Bad Gateway或Gateway Timeout)。

如何解决?

使用.htaccess和“php_value max_execution_time 0”?

或简单地从JavaScript发送新请求,当服务器返回错误时(它会使消息更慢)?

可能是,还有其他方法吗?

2 个答案:

答案 0 :(得分:6)

你应该查看APE项目。它是一个Ajax推送引擎,它可能有助于实时通信:www.ape-project.org

答案 1 :(得分:4)

如果在40秒内没有要从服务器推送的消息,则从服务器发送一些响应,基于客户端重新请求的响应。