关于Ajax php长轮询的问题任何真正的解决方案?

时间:2013-09-05 15:19:01

标签: php javascript ajax long-polling

我正在努力了解投票工作的时间。我已经阅读了很多教程,发现大多数教程都使用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

  
      
  • 如果($ currentmodif&lt; = $ tmstmp)必须虽然($ currentmodif&lt; = $ tmstmp)
  •   
     

根据我发现的教程。但是如果我使用则不起作用   直到我将其更改为(&gt; )为什么?

     

      
  • 如果我继续使用 if 而不是使用是不对的?

         
        

    您对我制作的这个剧本有什么建议吗?

  •     

  

过了一会儿(我们说几分钟),我收到消息服务无法使用bla bla bla

我真的很想知道另一个人如何做长期民意调查没有问题,例如facebook或其他聊天彗星。

Thank you for any answer.

1 个答案:

答案 0 :(得分:1)

编辑:

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

澄清生活在这里,以及一些利弊,可能是你的错误的原因:
Scaling a chat app - short polling vs. long polling (AJAX, PHP)

原文:

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

改为尝试这个逻辑:

  • 在您执行时发送时间戳,但如果数据库尚未更新,只需返回空响应或您可以识别为“未更新”的代码,并且不执行任何操作。
  • 摆脱那种“睡眠”,无需等待回复。
  • 建议:在javascript中,使用setInterval而不是递归setTimeout,并保留对该时间间隔的引用,以便稍后clearInterval可以停止轮询。
  • 我99%肯定Facebook和其他服务使用websockets而不是轮询(至少对于任何支持它的浏览器)。你可能想调查一下。