PHP原生支持Web Sockets吗?

83
寻找Web Sockets实现的Hello World类型示例:
这里是来自php.net的Socket Create参考,但这看起来比Web Sockets更低级。
我想使用在caniuse.com上展示的Web Sockets,这已经在所有新的主流浏览器中实现了。
谷歌搜索结果显示了这个Nets.TutsPlus网站,其中我可以使用JavaScript示例代码...但我需要知道如何在PHP中实现服务器端,而不是像示例中那样使用Java、Ruby或Node.js。
PHP Socket Create是否相关?PHP原生支持Web Sockets吗?我想只要指点一下PHP实现的正确方向就可以了。
实际上,教程中有一个损坏的链接到phpwebsockets...这是应该使用的库吗? Websockets.org有一个测试应用程序,但没有提到PHP。

2
这可能会有所帮助:PHP套接字编程,正确的方式 - ChocoDeveloper
2
在谷歌上搜索“PHP Websockets”会给你很多结果,比如:http://socketo.me/,http://www.flynsarmy.com/2012/02/php-websocket-chat-application-2-0/,http://code.google.com/p/phpwebsocket/。 - scrappedcola
1
我看不到在PHP中如何处理Web Sockets的明确方向...它是否本地支持或者我需要另一个库...这将是我实现时的第一个问题。 - user656925
1
在你的搜索过程中,请不要混淆sockets和web sockets。 - Brad
2
非常好的问题。这正是我想要问的。 - Gunah Gaar
显示剩余2条评论
2个回答

53

就本身而言,没有标准的PHP WebSocket对象可以供使用。

你需要使用库。

下一步要考虑的是WebSocket服务器如何运行。通常情况下,PHP在Apache、Nginx(通过FastCGI)或Microsoft IIS(通过FastCGI)上运行。对于Apache和IIS来说,这可能是个问题,因为它们并没有考虑像WebSockets这样的持久连接。我不确定Nginx是否也是如此。这就是为什么大多数PHP WebSocket库将作为独立的库构建,以便作为它们自己的进程运行。

参见:

注意:IE10现已在Windows 8中发布

还请参阅:Ajax推送系统


6
主机提供商支持这个吗?像godaddy.com、wiredtree.com这样的小主机提供商,我只需要选择一个库然后放到我的Web文件夹里就可以了吗?问题是我在用LAMP技术栈... - user656925
2
我向Wired Tree的技术支持进行了核实,他们表示一切正常。 - user656925
1
@leggetter,你能提供一下关于持久连接问题的链接吗?当我完全使用ajax时,我的带宽使用量急剧下降。100%使用Websocket后,下降速度大致相同。所以我非常好奇。先谢谢了! - user1382306
@leggetter只是试图节省空间。关于“通常的答案是,托管提供商不喜欢您创建持久连接 - 绝对不会有可能100个或1000个持久连接。”我想到的唯一一件事是假定WebSockets将使用更多带宽,但是我使用WebSockets与Ajax与PostBack相比使用更少的带宽。想知道您是否有关于该评论的详细信息。再次感谢! - user1382306
5
@Gracchus - leggetter说的几乎是常识。连接外部世界会带来许多问题,特别是当服务经常由新手编码员设计时。你会遇到进程管理问题、连接管理问题、安全问题(每个开放端口基本上都是系统的门),等等。此外,如果这项服务没有故障,没有安全问题,并且运行高效,它基本上就成为供应商的竞争服务。并不是很多商业模式都能接受这样的事情。 - JSON
显示剩余8条评论

12

是的,非常简单地实现 PHP + Websocket,无需使用任何第三方库(如经常提到的 Ratchet)。

这篇文章是一个非常轻量级的示例。(我曾经尝试了很多复杂的解决方案,都包括一些库,直到我找到了这篇有用、简洁的文章。)

你可以在这里找到更详细的说明:如何在PHP中创建Websockets服务器

它使用一个不断运行的 PHP 服务器,在命令行中使用 php websockets.php 启动,并带有一个事件循环(类似于 Node.JS 的方式)。它完全可以使用原生的 PHP 函数,例如 socket_create 等。


1
这正是我想要的!谢谢亲爱的。我对低级编程的工作原理非常感兴趣。 - aariow
这是一个不错的项目。如果您正在使用不安全的http页面,则无法启动或调用套接字。因此,此示例仅适用于不安全的连接(而不是https)。 - Adriano

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