【问题标题】:Is this a legitimate long polling approach?这是一种合法的长轮询方法吗?
【发布时间】:2012-11-06 10:47:07
【问题描述】:

这个 PhP 脚本是合法的长轮询方法还是对服务器来说很重?

$FoundNewContent = false;

$tokens = array();

while(!$FoundNewContent) {
    usleep(300000);
    clearstatcache();
    $SQL1 = "SELECT * FROM tokens WHERE  ID > ".$_GET['tokenID'];
    $result1 = mysql_query($SQL1);
    while($row1 = mysql_fetch_array($result1, MYSQL_ASSOC)) {
        array_push($tokens, $row1);
        $FoundNewContent = true;
    }
}

// Parse XML array    

flush()

我通过 Ajax 调用这个脚本。

【问题讨论】:

  • 如果$FoundNewContenttrue,你什么都不会做。之后你脸红了。输出是什么?只是空白?
  • 实际上在while循环和flush之间我解析了一个xml数组,然后在jQuery中处理
  • 你没有回应什么吧?我的意思是……我不确定……
  • 是的,我是 echo "" 然后通过 foreach 将所有内容作为标签
  • 是的,我应该提到...

标签: php mysql ajax long-polling


【解决方案1】:

取决于您的服务器设置 - 只要您不使用会话,它应该可以正常工作,但如果一次连接太多,它可能会停止服务器。

另外我会添加一个时间限制,它不返回任何内容并重新启动轮询。否则,如果没有添加数据并且服务器超时设置为无限制,脚本可能会永远运行。我通常会添加 30 秒的限制。

类似:

$FoundNewContent = false;
$tokens = array();
$time = time();
while(!$FoundNewContent) {
  usleep(300000);
  clearstatcache();
  $SQL1 = "SELECT * FROM tokens WHERE  ID > ".$_GET['tokenID'];
  $result1 = mysql_query($SQL1);
  while($row1 = mysql_fetch_array($result1, MYSQL_ASSOC)) {
    array_push($tokens, $row1);
    $FoundNewContent = true;
  }
  if($time<time()-30) break;
}
flush()

【讨论】:

  • 你的意思是像“session_start()”那样的会话,那么是的,我正在使用一个。
  • 是的 - 如果你使用 session_start() 根据我的经验,你需要在循环之前的某个地方运行 session_write_close() ,否则脚本会阻塞。 session_write_close() 将阻止您更改会话中的内容,因此如果必须,请在这样做之前使用 session_start() 并在之后再次使用 session_write_close()。
  • 因此,如果我一次有大约 10 到 15 个客户端轮询内容,即每秒 30 到 45 个 mysql SELECT 请求,我就不必担心了吗?
  • 10-15 个客户应该不是问题;o)
猜你喜欢
  • 2023-04-06
  • 2012-11-25
  • 2011-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-12
相关资源
最近更新 更多