【问题标题】:PHP Comet. How to do it better?PHP彗星。如何做得更好?
【发布时间】:2011-06-29 16:09:22
【问题描述】:

我有一个简单的彗星聊天。 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 发送新请求,当服务器返回错误时(它使获取消息更慢)?

可能,还有其他方法吗?

【问题讨论】:

  • 不要留下 SQL 注入漏洞。 $lastmodif = (int)$lastmodif;

标签: php javascript jquery chat comet


【解决方案1】:

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

【讨论】:

  • 如何在 40 秒后从服务器发送响应?使用刻度?
  • @slier ticks 不应该使用,而是使用一个全局变量来存储开始时间,并在处理函数中检查当前日期/时间与变量之间的差异,如果其限制可以发送响应超过
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2011-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-12
    • 2011-11-21
    • 2011-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多