我一直在努力让这个工作,只是对Web服务器上的PHP脚本的基本长轮询。我正在测试它有一个文本文件,我检查上次修改时间并将其与javascript发送请求的时间进行比较。如果文件的日期较新,那么我发回一条消息“更新”。当我在浏览器中加载页面时,它会发送请求并按预期等待,我可以使用Chrome开发工具验证,但是当我编辑文件时(即更改修改日期),update.php脚本永远不会回复更新消息。相反,它只会持续到超时为止。
我认为它可能与缓存有关,因为如果我将JS请求的URL复制到一个单独的选项卡中它也没有响应但是如果我更改jQuery附加的随机参数以防止缓存我得到了所需的“更新”消息。有什么想法是错的吗?
由于
主页上运行的javascript:
<script>
window.onload = function longPoll(){
var d = new Date;
$.ajax({
url: "http://localhost/site/update.php?time=" + d.getTime(),
success: function(data){
console.log(data);
},
error: function (xhr, ajaxOptions, thrownError) {
//error message here
},
type: "GET",
cache: false,
complete: longPoll,
timeout: 600000
});
}
</script>
更新脚本:
// while the file is NOT newer
while(!(filemtime('./test.txt') > $client_time)) {
sleep(1);
}
echo 'update';
?>
答案 0 :(得分:1)
要记住的事情:
1:永远不要相信你从客户那里得到的东西就像时间一样。
2:你发送到客户端服务器的时间实际上并不是你的意思,所以如果用户时间设置错误就像11 jun那么在服务器中你的当前时间是10月,
filemtime('./test.txt') > $client_time
总是返回false
3:检查文件状态时使用clearstatcache()
4:sleep(1)太高,特别是当您想部署高使用率网站时,将其更改为超过10毫秒
5:正如vher2所说,使用此代码完成:
complete: function(jqXHR, status) {
if (status === 'success'){
setTimeout(function(){ longPoll() }, 1000);
}
}
使用此代码检查服务器上的当前时间和从用户收到的时间:
var_dump(time() , $client_time);
答案 1 :(得分:0)
试试这个:
complete: function(jqXHR, status) {
if (status === 'success'){
setTimeout(function(){ longPoll() }, 1000);
}
}