PHP: 使用Golang处理websocket连接

5
我有一个使用SproutCore和PHP作为后端构建的大型Web应用程序。现在我想使用WebSockets实时更新客户端应用程序。据我所知,PHP很难处理持久连接。因此,我一直在考虑是否可以使用Go来处理WebSockets连接,并在每次接收到请求时调用我的PHP脚本(这个似乎可以实现)。
因此,我的第一个问题是,你们认为这是一个好主意(也是可行的,因为我没有找到其它人这样做过),还是我应该坚持使用PHP?
如果我使用Go来处理WebSockets连接,我也一直在考虑逐步从PHP转向仅使用Go(因为它比PHP快得多)。如果我这样做,我将必须能够从PHP调用某些Go包。这可以通过PHP的exec函数完成吗?还有更好的方法吗?再次问一遍,这是一个好主意吗?
2个回答

9

Go非常适合用于websocket服务器。我曾经用Go构建过websocket服务器,并且非常满意整个过程。我有一个服务在Go websocket服务器上处理每月300k用户,它几乎没有使用Amazon AWS微实例的1% CPU。我感到非常满意。

Websockets确实需要类似Go和Node.js这样的事件驱动框架来最大化利用服务器资源。像PHP这样的分叉Web进程比事件驱动框架消耗更多的资源。

如果您需要在某个时候从PHP调用Go,我建议使用API调用。虽然exec也可以工作。


看起来很有前途。所以你同意我的观点,即每次Go WebSocket服务器接收到请求时调用一个PHP脚本应该比完全在PHP中处理WebSocket连接要好得多。 - Nicolas BADIA
1
我也使用Go来运行我的websocket服务器(其中包括this)。它非常高效和干净。我认为使用PHP来做这件事真的是一个坏主意。 - Denys Séguret
1
每次Go WebSocket服务器接收到请求时调用一个PHP脚本几乎肯定是更好的解决方案。如果您的任何数据可缓存,可以在Go实例中进行缓存。其次,您仅使用足以回答请求的PHP资源,因此只要WebSockets不会不断推送新请求到PHP,PHP进程的总数应显着减少。最后,您将使自己处于逐步将所有PHP代码迁移到Go并实现巨大效率提升的位置。 - Daniel
一个替代 exec 的选项是使用 PHP-FPM 和 NGINX 以及一些 opcode 缓存器,例如 APC。这样可以让您以最快的方式运行 PHP 代码,而且不会受到 localhost 的限制。 - jurka

-1

这是一个老问题,但我对这个问题的看法是...

有一个非常好的 PHP 库可以做到你所要求的 - websockets。它被称为 Ratchet。当 PHP 可以完全胜任并且这也是我最熟悉的语言时,我不会使用 node.js (被过度吹嘘)或 go。在大多数情况下,通过使用 WebSockets 获得性能收益微乎其微,这并不值得更换整个技术栈。

如果您计划使用 Ratchet,还有其他一些有用的链接:


1
Ratchet的维护非常糟糕,他们的示例在最新版本的PHP(5.5+)中无法正常工作。虽然是一个好主意,但由于当前实现和所需的大量依赖项,它并不运行得很好。 - dearsina

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接