0

我正在尝试了解轮询的工作时间。我已经阅读了很多教程,发现其中大多数都使用 jQuery。对我来说,使用 jQuery 很好,因为它让事情变得更容易。不过说说学习javascript的基础吧。使用 jQuery 并不是我考虑的第一选择。

我已经进行了自己的 lomg 投票,对此有一些疑问。

在 javascript 中(我不会有整个脚本,因为我猜人们理解它非常基本)

function callme() {

var tmstmp= new Date().getTime(); // sending time stamp now to php
var url="test2.php?user_id=298&tmstmp="+tmstmp;
var params="user_id=298&tmstmp="+tmstmp;

xmlHttp=GetXmlHttpObject()
xmlHttp.onreadystatechange=function () {

 if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete"){

if (xmlHttp.responseText!=""){

document.getElementById("result").innerHTML=xmlHttp.responseText;
 }

setTimeout("callme()",1000);

 }
}

在 PHP 中

$user_id=$_POST['user_id'];
$tmstmp=$_POST['tmstmp'];
$params=$_POST['params'];

  $stmt = $conn->prepare('SELECT * FROM user where recipient=:recipient ORDER BY cr_id desc');
  $stmt->bindParam(':recipient', $user_id);
  $r=$stmt->fetch();

$currentmodif=$r['database_timestamp'];

if ($currentmodif <= $tmstmp) { ///**HERE IS THE QUESTION !!
  sleep(1);
  clearstatcache();
 $currentmodif =$r['database_timestamp'];
 }

echo $r['message'].'-->'.$tmstmp;

我的问题是:

实际上在php中

  • if ($currentmodif <= $tmstmp) 必须是While ($currentmodif <= $tmstmp)

根据我找到的教程。但是,如果我使用while 直到我将其更改为 ( > ) 为什么?

  • 如果我继续使用if这样而不是使用While这样做是错误的吗?

    你对我制作的这个脚本有什么建议吗?

过了一会儿(让我们说几分钟)我收到消息服务不可用 bla bla bla

我真的很想知道其他人如何毫无问题地进行长轮询,例如 Facebook 或其他聊天彗星。

Thank you for any answer.
4

1 回答 1

1

编辑:

基本上我的回答是从长轮询切换到短轮询。这是我的错。我是一个糟糕的回答者。

澄清在这里,还有一些优点/缺点,可能是你错误的原因:
缩放聊天应用程序 - 短轮询与长轮询(AJAX,PHP)

原来的:

乍一看:我认为您遇到的问题是您每秒都在轮询,但告诉服务器休眠一秒钟。如果您将其更改if为 awhile那么您将告诉它无限期地休眠,直到对 db 进行更改并$currentmodif更新。您要做的是将响应发送回 js,而不是在响应之前等待做出更改。

试试这个逻辑:

  • 像你正在做的那样发送时间戳,但如果数据库没有更新,只需返回一个空响应或一个你可以识别为“未更新”的代码并且什么都不做。
  • 摆脱那种“睡眠”,无需等待返回响应。
  • 建议:在 javascript 中,使用 asetInterval而不是 recursive setTimeout,并保留对该区间的引用,以便clearInterval稍后停止轮询。
  • 我 99% 肯定 facebook 和其他服务使用 websockets 而不是轮询(至少对于任何支持它的浏览器)。您可能想对此进行调查。
于 2013-09-05T15:52:58.283 回答