【发布时间】:2016-01-08 18:09:34
【问题描述】:
对于一些已经对此有所了解的人来说,这可能是一个愚蠢的问题,也许我只需要更多coffee。
问题:无论是使用websockets 还是ajax,似乎仍在进行一些轮询。这是正确的吗?
示例 (不是真正的项目):我想关注一个文本文件。除非我遗漏了一些东西(更多咖啡?),否则我是否仍然需要 a) 询问服务器是否有更新,或者 b) 告诉页面我有更新;通过将 PHP 代码休眠一段时间或在客户端使用 setTimeout 循环。
我确实理解的事情:我肯定已经看到了在服务器和页面之间来回交谈的好处。我看到我没有发送 http 请求。所以我看到了好处。
详情:我一直只使用xmlhttprequest,所以我决定检查一下整个websockets,据我所知,数据是实时发送到客户端的,但是,如上所述,除非我在这里遗漏了什么或一些逻辑,似乎我仍然必须告诉php 或javascript 来检查数据的间隔,否则数据将在无限循环中发送(想象一下调用 mysql)。
也许我的代码中的逻辑很糟糕。欢迎您查看。从我找到的所有示例中,每个人似乎都只是在 PHP 中运行了一个无限循环
PHP(减去所有连接术语)
while(true) {
// update once a second
$this->send($client, file_get_contents('/my/file/test.txt'));
sleep(1);
}
Javascript
var websocket = new WebSocket( "ws://mysite.com:12345" );
websocket.onmessage = function( str ) {
console.log( str.data );
};
我只是没有掌握关于如何在没有某种轮询的情况下使其成为实时的逻辑。也许这就是它应该如何工作的方式。
我确实明白,如果我从 php 代码中删除睡眠,事情会变得更加实时,太多了,但这似乎会无限轮询上面示例中的文件,这似乎不对。
编辑:为了澄清,我并不是专门寻找观看文本文件的特定解决方案。如果您略读这个问题,您可能会想到这一点。
编辑: 未来的访问者,对此的回答是:当用户发送更改时,您将更改发送到打开的连接,而不是专门观察更改。
【问题讨论】:
-
一般来说,websocket/socket 的目的是保持一个始终打开的恒定连接,所以在聊天程序的情况下..客户端在接收数据时,他们通过不必每隔几秒钟轮询/发布到服务器以显示响应来节省带宽。只需等待并触发收到的事件。关于监视服务器端文件,这需要轮询。但是服务器本身会轮询文件并向所有客户端发送更新,而不是所有客户端每隔几秒钟检查一次服务器,这里的 Websockets 仍然会为您节省带宽。
-
我完全理解 websockets 的用途。问题是关于新内容的轮询以及其背后的逻辑如何运作。
-
如前所述,您仍然可以让 PHP 在本地轮询文件,然后在检测到更改时通知客户端,告知您如何轮询文件。这可能会有所不同,您可以使用 CRON 作业,但需要在另一个威胁/php 脚本上运行套接字服务器。可能使用php.net/manual/en/function.fam-monitor-file.php,否则我只会在套接字服务器的主循环中运行类似 FAM 函数的东西, 如果检测到,则发送到所有消息。
-
澄清一下,您正在回答这部分“问题:无论是使用 websockets 还是 ajax,似乎仍有一些轮询发生。这是正确的吗?”用“是”?
-
对于纯客户端和服务器通信,没有轮询。为了让 PHP 能够检测到服务器端文件的变化,是的,会有某种形式的轮询。让 1000 个客户端全部 ajax 轮询您的服务器,每个触发服务器检查 = 1000 次检查文件。 Websocket 只是服务器在自己的循环中轮询并在为真时发送消息。所以套接字在这里更适合您的需要。至于文件,它只是用于检查文件是否已更改的标准 php 代码。
标签: coffee websockets ajax xmlhttprequest php javascript php javascript php websocket phpwebsocket