关于Ajax php中长轮询的问题有什么真正的解决方案吗?
我正在努力了解投票的工作时间。我已经阅读了很多教程,发现其中大多数都使用jQuery。对我来说,使用jQuery很好,因为它使事情变得更简单。但是要谈谈学习javascript基础。使用jQuery并不是我考虑的第一选择 我已经做了自己的lomg投票,对此有一些疑问 在javascript中(我不会有完整的脚本,因为我想人们理解它非常基本) 在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
$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而不是轮询(至少对于任何支持它的浏览器)。您可能需要对此进行调查李>
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.