- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我可以找到很多关于长轮询如何工作的信息(例如,this 和 this),但没有简单示例说明如何在代码中实现这一点。
我只能找到 cometd ,它依赖于 Dojo JS 框架,以及相当复杂的服务器系统..
基本上,我将如何使用 Apache 来处理请求,以及我将如何编写一个简单的脚本(例如,用 PHP)来“长轮询”服务器以获取新消息?
该示例不必是可扩展的、安全的或完整的,它只需要工作即可!
最佳答案
这比我最初想象的要简单。基本上你有一个页面什么都不做,直到你想要发送的数据可用(比如,一条新消息到达)。
这是一个非常基本的示例,它会在 2-10 秒后发送一个简单的字符串。三分之一的机会返回错误 404(在接下来的 Javascript 示例中显示错误处理)
msgsrv.php
<?php
if(rand(1,3) == 1){
/* Fake an error */
header("HTTP/1.0 404 Not Found");
die();
}
/* Send a string after a random number of seconds (2-10) */
sleep(rand(2,10));
echo("Hi! Have a random number: " . rand(1,10));
?>
注意:对于一个真实的站点,在像 Apache 这样的常规网络服务器上运行它会很快占用所有“工作线程”并使其无法响应其他请求。有一些方法可以解决这个问题,但它是建议在 Python 的 twisted 中编写“长轮询服务器” ,它不依赖于每个请求一个线程。 cometD是一种流行的(有多种语言版本),并且 Tornado是一个专门为此类任务制作的新框架(它是为 FriendFeed 的长轮询代码构建的)......但作为一个简单的例子,Apache 绰绰有余!这个脚本可以很容易地用任何语言编写(我选择了 Apache/PHP,因为它们很常见,而且我碰巧在本地运行它们)
然后,在 Javascript 中,您请求上述文件 (msg_srv.php
),然后等待响应。当你得到一个时,你就根据数据采取行动。然后你请求文件并再次等待,对数据采取行动(并重复)
以下是此类页面的示例。当页面加载时,它会发送对 msgsrv.php
文件的初始请求。如果成功,我们将消息附加到#messages
div,1秒后我们再次调用waitForMsg函数,触发等待。
1 秒 setTimeout()
是一个非常基本的速率限制器,没有这个它可以正常工作,但是如果 msgsrv.php
always立即返回(例如,出现语法错误)——你淹没了浏览器,它很快就会死机。最好检查文件是否包含有效的 JSON 响应,和/或保持每分钟/秒的请求总数,并适当暂停。
如果页面出错,它会将错误附加到 #messages
div,等待 15 秒然后重试(与我们在每条消息后等待 1 秒的方式相同)
这种方法的好处是它非常有弹性。如果客户端 Internet 连接中断,它将超时,然后尝试重新连接 - 这是轮询工作时间长短所固有的,不需要复杂的错误处理
不管怎样,long_poller.htm
代码,使用jQuery框架:
<html>
<head>
<title>BargePoller</title>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js" type="text/javascript" charset="utf-8"></script>
<style type="text/css" media="screen">
body{ background:#000;color:#fff;font-size:.9em; }
.msg{ background:#aaa;padding:.2em; border-bottom:1px #000 solid}
.old{ background-color:#246499;}
.new{ background-color:#3B9957;}
.error{ background-color:#992E36;}
</style>
<script type="text/javascript" charset="utf-8">
function addmsg(type, msg){
/* Simple helper to add a div.
type is the name of a CSS class (old/new/error).
msg is the contents of the div */
$("#messages").append(
"<div class='msg "+ type +"'>"+ msg +"</div>"
);
}
function waitForMsg(){
/* This requests the url "msgsrv.php"
When it complete (or errors)*/
$.ajax({
type: "GET",
url: "msgsrv.php",
async: true, /* If set to non-async, browser shows page as "Loading.."*/
cache: false,
timeout:50000, /* Timeout in ms */
success: function(data){ /* called when request to barge.php completes */
addmsg("new", data); /* Add response to a .msg div (with the "new" class)*/
setTimeout(
waitForMsg, /* Request next message */
1000 /* ..after 1 seconds */
);
},
error: function(XMLHttpRequest, textStatus, errorThrown){
addmsg("error", textStatus + " (" + errorThrown + ")");
setTimeout(
waitForMsg, /* Try again after.. */
15000); /* milliseconds (15seconds) */
}
});
};
$(document).ready(function(){
waitForMsg(); /* Start the inital request */
});
</script>
</head>
<body>
<div id="messages">
<div class="msg old">
BargePoll message requester!
</div>
</div>
</body>
</html>
关于php - 如何实现基本的 "Long Polling"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/333664/
我原以为 epoll 应该比 poll 快,但是当我做下面的实验时,结果发现它更慢。 首先,我设置了 1 个连接了 10 个客户端套接字的服务器套接字。 import socket server =
当我尝试在代码编辑器中粘贴时他剪掉了我的标签。它不允许它..我不明白,我什么都试过了。 有人可以帮助我.. 给我> extended_valid_elements: 'poll[poll-id
我无法唤醒被 poll.poll() 函数阻塞的线程。有人可以帮我吗? 最佳答案 处理这个问题的方法是在传递给 poll() 的描述符列表中包含一个额外的文件描述符。对于该描述符,等待读取准备就绪。让
在下面的 poll() 方法中,我的 IDE 提示它返回 JobSet。工具提示显示: my.package.JobSetQueue 中的 poll() 与 java.util.concurrent.
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 5 年前。 Improve this qu
在每个 youtube 教程中,我都看到人们只是将“app_name”添加到 INSTALLED_APPS 列表中。 昨天我开始了官方 Django 教程,他们建议使用“app_name.apps.A
我正在查看 LinkedList 中的 poll() 和 unlinkFirst() 代码,但我似乎找不到如何实现如果 LinkedList 中存在 null 项,它可以防止返回 null。 poll
为什么当我尝试轮询时,我在 ajax 中看到此错误消息“(!)注意: undefined index :在 D:\wamp\www\poll\poll.php 第 6 行中进行轮询”。我有两个文件 1
我使用 python 的 cProfile 模块分析了我的 python 代码并得到了以下结果: ncalls tottime percall cumtime percall filen
我尝试通过 websocket 和轮询运行我的 socket.io 程序,它们都有效。但是,当尝试运行 xhr-polling 时,它会超时。这可能是什么原因造成的? 对于这个程序,我使用的是 soc
我正在实现自己的自定义组件,我发现我需要为消费者提供两个用例: 第一个尝试经常获取 N 条可用消息(轮询消费者) 第二个是订阅者消费者,它会在消息可用时获取消息。 我的主要问题是是否可以实现这两种类型
测试环境:Ubuntu 12.04描述:我做了以下 # `sudo truncate -s 0 /var/log/syslog` # logger "helloworld". # `cat /var/
我正在使用(很棒的)mrjob Yelp 的库在 Amazon 的 Elastic Map Reduce 中运行我的 python 程序。它依赖于标准 python 库中的子进程。在我运行 pytho
这直接来自民意调查教程,我是编程新手,正在学习 Python 和 Django,这对我来说看起来很陌生。这是 JavaScript 吗?我还需要学习什么语言才能学习 Django 吗? 民意调查/模板
我试图了解在 kafka 消费者中处理需要更长时间处理的记录的更好选择是什么?我进行了一些测试来理解这一点,并观察到我们可以通过修改 max.poll.records 来控制这一点。或 max.pol
我正在尝试创建我的 Django 项目/网站的“投票”部分,教程 (https://docs.djangoproject.com/en/1.8/intro/tutorial01/) 说在我们“激活”模
我有一个应用程序,其工作原理如下:Linux 机器生成 28 种不同类型的给客户的信件。信件必须以 .docx(Microsoft Word 格式)发送。秘书维护 MS Word 模板,必要时会自动使
我目前正在尝试让 FileSystemWatcher 工作,如 this question 中所述.在我的研究过程中,我在这个网站上发现了很多描述这个类(class)不可靠的答案和评论。相反,在某些地
我正在寻找 kafka 来实现低延迟消息队列,并且我一直在阅读有关消费者长轮询的信息。但是,没有关于如何实际使用长轮询或需要设置哪些选项才能启用它的示例。如何使用 kafka java api 启用长
用户首次登录时的通知,没那么难,只需要扫描数据库,我可以处理。然而,当 friend 在个人资料 X 上发送请求或评论时,会发送通知,并且几乎立即在另一端收到通知,即使用户 X 没有提出任何请求。是投
我是一名优秀的程序员,十分优秀!