Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/426.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关于Ajax php中长轮询的问题有什么真正的解决方案吗?_Php_Javascript_Ajax_Long Polling - Fatal编程技术网

关于Ajax php中长轮询的问题有什么真正的解决方案吗?

关于Ajax php中长轮询的问题有什么真正的解决方案吗?,php,javascript,ajax,long-polling,Php,Javascript,Ajax,Long Polling,我正在努力了解投票的工作时间。我已经阅读了很多教程,发现其中大多数都使用jQuery。对我来说,使用jQuery很好,因为它使事情变得更简单。但是要谈谈学习javascript基础。使用jQuery并不是我考虑的第一选择 我已经做了自己的lomg投票,对此有一些疑问 在javascript中(我不会有完整的脚本,因为我想人们理解它非常基本) 在PHP中 $user_id=$_POST['user_id']; $tmstmp=$_POST['tmstmp']; $params=$_POST['pa

我正在努力了解投票的工作时间。我已经阅读了很多教程,发现其中大多数都使用jQuery。对我来说,使用jQuery很好,因为它使事情变得更简单。但是要谈谈学习javascript基础。使用jQuery并不是我考虑的第一选择

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

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

在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;
编辑:

基本上,我的答案是从长轮询切换到短轮询。这是我的错。我回答得不好

这里有澄清,还有一些优点/缺点,可能还有您的错误原因:

原件:

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

相反,尝试以下逻辑:

  • 在执行时发送时间戳,但如果数据库尚未更新,只需返回一个空响应或一个可以识别为“未更新”且不执行任何操作的代码
  • 摆脱那种“睡眠”,不需要等待回复
  • 建议:在javascript中,使用
    setInterval
    而不是递归的
    setTimeout
    ,并保留对该间隔的引用,以便以后可以
    clearInterval
    并停止轮询
  • 我99%肯定facebook和其他服务使用WebSocket而不是轮询(至少对于任何支持它的浏览器)。您可能需要对此进行调查
星云感谢您的评论。我同意你的看法。但是有一些问题:如果按照你的建议去做,这和使用setInterval的普通ajax调用没有什么不同吗?我的意思是我的目标是:减少服务器的工作量。如果我这样做,就不能再称之为长轮询了?我在想,也许我会像你说的那样,把自己放进WebSocket。因为我可以在等待页面运行几分钟后看到错误。好像电话太多了,我可以每30秒打一次。但我的目标是像即时消息一样快,但我不想在我有很多用户之后出现这个问题。你会说什么?setInterval和setTimeout将做几乎相同的事情,我只是认为在callme()方法之外使用
var interval=setInterval('callme',1000)
更干净。我不认为问题来自每秒轮询服务器,我认为错误来自告诉服务在更新
$currentmodif
之前睡眠(1)。对不起,我没说清楚。我的建议是摆脱睡眠,并立即回复js。无论如何,听起来不错。我花了很多时间阅读了很多教程。我没有找到真正的解决办法。只是举例说明它是如何工作的,但不能在实际中使用。因为很多问题随之而来。我现在看不出有什么问题,但我可以注意到当用户越来越多时,网络开始变慢。因为我做的这个函数调用了很多。谢谢你的更新,我会检查:)如果
,而
执行不同的操作,结果相似,这就是为什么你找不到它。如果按原样使用
If
;每秒钟js将ping php,它将检查、等待(无原因)并返回。如果您使用的是
while
构造,它将按预期执行,但可能负载过大。js将ping php,php将在发送回js之前等待响应。将等待一秒钟,然后重试。类似但不同的操作。
$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;
Thank you for any answer.