这是长轮询(彗星编程)的正确方法吗?
Is this the proper method to Long Polling(Comet programming)
首先,我要感谢你们所有伟大的人对新程序员的帮助。
我有一个关于长轮询的问题。我研究过一些关于Comet编程的长轮询技术的文章。该方法对我来说似乎很困难,因为它有时还需要在服务器端安装一些脚本。
现在我找到了一个关于长轮询的例子。它工作得很好,但我不确定它是否是正确的方法。示例脚本是关于类似聊天的应用程序的。此 php 脚本的工作原理如下:
- php 脚本会不断检查数据.txt文件,直到它被更改。
- 一旦数据.txt被更改,新文本就会输出到网页上。
这是 php 脚本:
<?php
$filename = dirname(__FILE__).'/data.txt';
// store new message in the file
$msg = isset($_GET['msg']) ? $_GET['msg'] : '';
if ($msg != '')
{
file_put_contents($filename,$msg);
die();
}
// infinite loop until the data file is not modified
$lastmodif = isset($_GET['timestamp']) ? $_GET['timestamp'] : 0;
$currentmodif = filemtime($filename);
while ($currentmodif <= $lastmodif) // check if the data file has been modified
{
usleep(500000); // sleep 500ms to unload the CPU
clearstatcache();
$currentmodif = filemtime($filename);
}
// return a json array
$response = array();
$response['msg'] = file_get_contents($filename);
$response['timestamp'] = $currentmodif;
echo json_encode($response);
flush();
?>
我没有包括网页代码来保持问题简单。该网页只有一个div,无论何时更改.txt都会显示数据的文本。
我问题的要点是:
- 这种循环方法是长时间轮询服务器的正确方法吗?
- 此外,当服务器正在执行
sleep();
其他并发请求会发生什么? - 是否有任何技术可以减少由于长轮询的连续脚本而导致的服务器负载?
- 如果启动此长轮询请求的客户端断开连接,我们如何知道并相应地停止该断开连接的客户端的脚本?
请指导我解决这个问题...谢谢
是的,这是一个想法。您应该记住,此脚本不会结束,并且将为每个用户生成一个 PHP 实例。我正在 v8cgi 服务器端使用长轮询逻辑。客户端启动 XMLHttp 请求 (XHR) 后,服务器开始按时间间隔检查新输入。我添加了一个计时器服务器端,每 5 分钟发送一次响应,之后客户端 - 如果没有断开连接 - 重新发送 XHR 并重复该过程。
因此,服务器端机制的每个实例最多运行不超过 5 分钟,因为如果客户端断开连接,服务器在 5 分钟后发送的响应不会后跟新的 XHR。
该过程如下所示:
- 客户端发送 XHR
- 服务器生成会定期处理和检查更新
- 如果必须发送某些更新:服务器发送响应
- 客户端处理响应并重新启动 XHR
- 服务器生成进程并定期检查更新
- 如果 5 分钟过去了没有更新:
- 服务器发送响应并退出生成的进程
- 客户端进程(空)响应重新启动 XHR
- 服务器生成新进程并开始检查
- 如果必须发送某些更新:服务器发送响应
- [...]
- 如果 5 分钟过去了没有更新:
- [...]
- 直到客户端断开连接(= 服务器响应后没有新的 XHR)
是的,这是一种简单方便的方法,它不是正确的方法,但不是最好的主意。 因为它会受到影响,并且随着用户的增加,它会导致许多问题。
对于共享主机,这不是一个好主意,只有当用户数量不大并且您拥有自己的服务器时,此方法才能正常工作。 如果您在共享主机服务器中使用此方法,则可能会遇到使用的最大服务器资源,或会话锁定问题,并且HTTP服务可能在一段时间内不可用。
或者,您可以将现有的API用于聊天应用程序,或者拥有可以运行脚本(如node.js
和类似服务器模块)的专用服务器
- 以编程方式填充组合框道场 (1.8) 的最佳方法是什么?
- 编程实践-使用helper方法隐藏对象
- Javascript - 以编程方式执行所有函数输入的方法
- 有没有一种方法可以通过编程方式按下键盘键
- 有没有任何方法可以通过编程将浏览器选项卡放在前面(跨浏览器)
- 在 html 页面上,javascript 是以编程方式操作 DOM 的唯一方法吗?
- 这是长轮询(彗星编程)的正确方法吗?
- 如何在 Firefox 中以编程方式将焦点应用于 iframe 中的父框架(解决方法为 window.focus())
- 如何在回发上保留选定的选项卡或以编程方式调用之前激活方法
- 从JS以编程方式使用CSS转换的干净方法
- 是编程中使用的科学方法
- 试图找到一种好看的方法来使用函数式编程风格转换这个数组
- 任何在没有完全重新编程/重新编程的情况下为我的迷宫添加边界的方法
- 通过编程将数据添加到JSON的最简单方法是什么
- 有没有一种简单的方法可以从 JavaScript 或任何其他编程语言中的数组中进行随机选择
- 使用记录行对ajax进行编程的有效方法
- 是否存在“;编程文化;解释为什么FF从measureText方法返回长分数
- 是否有一种方法可以通过编程触发TAB键将焦点移动到下一个可聚焦的元素
- 是否有方法以编程方式确定私钥是用DER还是PEM编码的?
- 有没有一种方法可以在javascript中以编程方式放大或平移Bing地图?