Websocket是封装在HTML5中的一种很酷的尖端技术。基本上,您可以打开一个websocket来启用与Web服务器的持久性双向通信。客户端(用户界面)可以自发发送消息,服务器也可以发送消息。
现有技术(JavaScript)要求客户端启动所有内容-服务器无法向客户端发送任何内容,即客户端没有要求。因此,脚本需要不断刷新和重新请求可能未更改的数据。 Websocket在“推送”的基础上进行更多工作,并随时让新数据通过管道。
不幸的是,大多数(无论如何,我都能找到)Websocket实现需要特定的服务器应用程序才能工作。人们将在端口80和443(http和https)上运行Apache,并在另一个端口(即8000或8080)上运行另一个系统(通常是Node.js)来处理websocket请求。
显然,这可行,但是一些缺点。
我有一个要构建的插件,可以从在WordPress中使用websockets大大受益。但是,如果用户需要安装第二台Web服务器(对于共享主机的用户通常是不可能的),那么它将不能作为插件使用。
因此,对于任何有经验的人,您将如何制作WordPress与websocket兼容吗?您是让WordPress处理通讯本身,还是将另一个小型服务器脚本捆绑到插件中?如果您已经做到了,那么如何在不破坏WordPress本身的情况下完成它呢?
可能的资源?


9/21/11更新
谈论了Apache(在共享主机上运行WP的最常用安装的服务器)如​​何无法真正本地处理websockets的话题,我想知道一种替代方法。多个插件(例如JetPack)与外部服务或API通讯以生成内容。
Stats向Automattic请求内容。 Akismet从外部服务器来回发送数据。截止日期在发布时提交内容。一些SEO工具通过外部系统来回传递信息。
作为将Websocket代码存储在WordPress插件中的一种替代方法,将Websocket服务托管在中央位置并拥有WordPress是否可行前端与此交互吗?

评论

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

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

#1 楼

WebSockets使用websockets协议:WS:/example.com/yourscript.js并打开一个同步连接-意味着该连接保持打开状态并专用于浏览器。httpd服务器,例如apache2(由大多数共享的托管服务提供商)使用http协议:http://example.com/yourscript.js并打开一个异步连接-表示服务器与浏览器之间没有打开的连接。 (您可以通过设置某些配置参数来适度延长打开连接的时间-但通常来说,它是异步的。)

您可以想象,维护浏览器和服务器之间的打开连接会将更多服务器资源用于每个浏览器连接,因此比在每次请求后删除连接更耗费服务器资源。可以理解的是,共享托管服务提供商不愿在共享托管上支持WS。测试或实验目的。“

因此,尽管可以想象一个将python代码捆绑在一起的插件来创建pywebsocket服务器,但要考虑到支持它的apache服务器,我认为它永远不会是合理的分发这样做的插件。

评论


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

–EAMann
2011年9月19日在22:19

#2 楼

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

#3 楼

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

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

主题中的一些示例:


Nginx中的Websocket(带有Socket.IO和Gevent)
用nginx代理websocket服务器

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

评论


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

–EAMann
2011-09-20 13:55

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

–petermolnar
2011-09-20 14:10



#4 楼

另一个潜在的解决方案是使用第三方Web套接字提供程序,我在Pusher(http://pusher.com/)上进行了一些尝试,可以利用其中的API来满足您的需求正在尝试做。我一直在考虑如何在自己的WordPress网站中使用它。 。与安装和维护自己的Web Sockets服务器相比,使用它要容易得多,这实际上对于其他尝试使用插件的人来说是一个优势。

#5 楼

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

评论


“提供此类便利的收入流” ...很好:-)

–EAMann
2011年9月21日19:23在