可以使WordPress支持websockets吗?


18

Websocket是封装在HTML5中的一种很酷的尖端技术。基本上,您可以打开一个websocket来启用与Web服务器的持久性双向通信。客户端(用户界面)可以自发发送消息,服务器也可以发送消息。

现有技术(JavaScript)要求一切都由客户端启动-服务器无法将客户端未请求的任何内容发送到客户端。因此,脚本需要不断刷新和重新请求可能未更改的数据。Websocket在“ 推送 ”的基础上进行更多工作,并随时让新数据通过管道传输。

不幸的是,大多数(无论如何,我都能找到)websocket实现需要特定的服务器应用程序才能工作。人们将在端口80和443(http和https)上运行Apache,并在另一个端口(即8000或8080)上运行另一个系统(通常是Node.js)来处理websocket请求。

显然,这可行,但是有一些缺点。

我有一个要构建的插件,可以从在WordPress中使用websocket 大大受益。但是,如果用户需要安装第二台Web服务器(对于共享主机的用户通常是不可能的),那么它将不能作为插件使用。

那么,对于任何有经验的人,您将如何使WordPress与websocket兼容?您是让WordPress处理通信本身,还是将另一个小型服务器脚本捆绑到插件中?如果您已经完成此操作,如何在不破坏WordPress本身的情况下完成它呢?

可能的资源?


9/21/11更新

关于Apache(在共享主机上运行WP的最常用安装的服务器)如​​何无法真正原生地处理websocket的话题,我想知道有没有其他选择。多个插件(例如JetPack)与外部服务或API通讯以生成内容。

统计信息从Automattic请求内容。Akismet从外部服务器来回发送数据。截止日期之后在发布时提交内容。一些SEO工具通过外部系统来回传递信息。

因此,作为将Websocket代码包含在WordPress插件中的替代方法,将Websocket服务托管在中央位置并让WordPress前端与其交互是可行的吗?


3
底线是这样的:如果websockets在本机Web服务器上不能很好地工作,那么您就不能轻易地在该Web服务器上完成它。这不是特定于WordPress的问题。如您所述,websocket通常需要一个单独的服务器,例如node.js之类的东西,它们根本无法很好地与Apache配合使用。因此,您的问题不是“我如何使其与WordPress兼容”之一,而是“如何使它在最低的公分母托管平台上工作”,这是另一回事。
奥托

可以使用内置的WebSocket服务器和诸如admin-ajax.php之类的终结点将WebSocket支持添加到WordPress核心中。还有一个用于WebSocket的JavaScript前端/ Node.js后端库Socket.IO,具有轮询功能,该功能由WordPress背后的公司Automattic开发。
baptx '17

Answers:


8

WebSockets使用websockets协议:WS:/example.com/yourscript.js并打开一个同步连接-意味着该连接保持打开状态并专用于浏览器。

httpd服务器(如apache2(大多数共享主机提供商使用))使用http协议:http://example.com/yourscript.js并打开一个异步连接-意味着服务器与浏览器之间没有打开的连接。(您可以通过设置某些配置参数来适度延长打开连接的时间-但一般来说,它是异步的。)

可以想象,维护浏览器和服务器之间的开放连接将更多的服务器资源分配给每个浏览器连接,因此,与在每个请求之后删除连接相比,对服务器资源的负担更多。可以理解,共享托管服务提供商不愿意在共享托管上支持WS。

尽管某些共享主机可能已安装mod_python,从而允许您的插件用户运行pywebsocket,但pywebsocket自己的文档明确指出“ pywebsocket用于测试或实验目的”。

因此,尽管可以想象一个将Python代码捆绑在一起的插件来创建pywebsocket服务器,而给定一个支持它的apache服务器,但我认为分发这样做的插件并不合理。


有一些直接声称支持Websocket的PHP库。它们是否能在Apache中有效地工作将是一个有趣的测试。看到链接的更新...
EAMann 2011年

3

我认为,根据您的更新,根据我所做的研究,这将是最好的选择。更好的办法是创建前端插件,并创建外部Websocket服务以与插件对话,并收取一定的费用,以便您可以根据自己的想法获利。您甚至可以提供websocket服务的源代码,并在插件中创建一个设置以设置websocket服务的位置(域/ IP和端口)。


2

为此,请忘记“经典” apache2-apache2-mpm-prefork。也许apache2-mpm-event可以解决这个问题,但这是实验性的。由于apache2不是事件驱动的,因此存在@marfarma描述的问题。您需要一个事件驱动的Web服务器来进行这种服务,例如切诺基或nginx。

nginx可以为WordPress带来真正的好处(因为wordpress.com也将其用作服务器),并且可以将指定的请求代理到node.js服务。

主题中的一些示例:

我还为nginx + php-fpm + wordpress设置制作了一个小教程


忘记“经典”方法并不是为非专业用户生成易于安装的插件的选择。是的,可以选择使用nginx,切诺基或node.js从服务器提供服务,但您不能仅将其放在插件自述文件中,并希望用户a)了解它或b)能够对它。
EAMann 2011年

apache2-mpm-prefork并非旨在处理这种使用。有些插件需要使用memcached,APC等,因此只需要基于事件的Web服务器即可。这是一个后端需求,mpm-prefork和mpm-worker都不适合。
petermolnar 2011年

1

另一个潜在的解决方案是使用第三方Web套接字提供程序,我在Pusher(http://pusher.com/)上进行了一些尝试,可以利用其中的API来满足您的需求正在尝试做。我一直在考虑如何在自己的WordPress网站中使用它。

一个可能的缺点是,其他尝试使用您的插件的人也必须获得一个Pusher帐户才能正常使用。与安装和维护自己的Web Sockets服务器相比,它的工作要容易得多,这实际上对于其他尝试使用插件的人来说是一个优势。


0

简短的答案是:是的,它是可行的。不过,我可能会研究比您托管的单点故障VPS更分散的内容。也许研究某些负载均衡的EC2系统或类似系统?(我假设您有提供此类便利的收入来源。咧嘴笑


1
“提供此类便利的收入流”……
真是
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.