dongying6659 2013-09-05 15:19
浏览 138
已采纳

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

I´m trying to learn how long polling work. I have read many tutorials out there and found most of them use jQuery. For me using jQuery is nice because it make thing easier. But to talk about learning javascript basic. Using jQuery is not the first choice for me to think about.

I have made my own lomg polling and have some question about it.

in javascript ( I will not have whole script because I guess people understand it very basic)

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);

 }
}

In 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;

My question is :

Actually in php

  • if ($currentmodif <= $tmstmp) Must be While ($currentmodif <= $tmstmp)

According to the tutorials I found. But it´s not work if I use while Until I change it to be (>) WHY ?

  • If I will keep on using if like this instead of using While is it wrong to do ?

    Do you have any suggestion about this script I made ?

After a while (let´s say some minutes) I got message Service unavailable bla bla bla

I really wonder how the other poeple do the long polling without problem, Example facebook or other chat comet.

Thank you for any answer.
  • 写回答

1条回答 默认 最新

  • dqb78642 2013-09-05 15:52
    关注

    Edit:

    Basically my answer was to switch from long polling to short polling. This was wrong of me. I am a bad answerer.

    clarification lives here, along with some pros/cons and possibly a reason for your error:
    Scaling a chat app - short polling vs. long polling (AJAX, PHP)

    Original:

    First glance: I think the issue you're running into is that you're polling every second, but telling the server to sleep for a second. if you change that if to a while then you'll be telling it to sleep indefinitely, until a change has been made to the db and the $currentmodif is updated. What you want to do is send a response back to the js, not wait for a change to be made before responding.

    instead try this logic:

    • send the timestamp through as you're doing, but if the database hasn't been updated, just return an empty response or a code you can recognize as "not updated" and do nothing.
    • get rid of that "sleep", theres no need to wait to return a response.
    • suggestion: in the javascript, use a setInterval instead of a recursive setTimeout, and keep a reference to that interval around so you can clearInterval later and stop the polling.
    • I'm 99% positive that facebook and other services use websockets instead of polling (at least for any browsers that support it). you may want to investigate this.
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 一个服务器已经有一个系统了如果用usb再装一个系统,原来的系统会被覆盖掉吗
  • ¥15 使用esm_msa1_t12_100M_UR50S蛋白质语言模型进行零样本预测时,终端显示出了sequence handled的进度条,但是并不出结果就自动终止回到命令提示行了是怎么回事:
  • ¥15 前置放大电路与功率放大电路相连放大倍数出现问题
  • ¥30 关于<main>标签页面跳转的问题
  • ¥80 部署运行web自动化项目
  • ¥15 腾讯云如何建立同一个项目中物模型之间的联系
  • ¥30 VMware 云桌面水印如何添加
  • ¥15 用ns3仿真出5G核心网网元
  • ¥15 matlab答疑 关于海上风电的爬坡事件检测
  • ¥88 python部署量化回测异常问题