PHP + ? = 实时更新

8

你好,我想知道有没有可以在PHP中使用实时更新的东西。

我学了node.js,希望解决这个问题,但我不知道有很少托管选项来托管使用php和node.js的站点,而且我不喜欢它们。

以下是我的技术栈:

  1. PHP
  2. MySql
  3. CSS
  4. HTML
  5. JavaScript(显然是Ajax)

如果不使用ajax,实时更新的最佳选项是什么?


1
什么是“实时更新”?也许是套接字? - Jeff
你的技术栈使用了ajax,但是你想要更新而不使用ajax? - Ben
Ben - 是的,这是因为我不想每秒向数据库发出一次请求,想象一下如果有70K个用户每秒都发出1个请求。 - user8348171
Jeff,你能再解释一下吗?我知道socket.io,但我认为它和node.js一样会有问题。 - user8348171
https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API - Jeff
显示剩余2条评论
1个回答

26

你需要的是 WebSockets

与 AJAX 不同,AJAX 是在客户端向服务器发送请求后服务器再回送数据。而 WebSockets 允许服务器在任何时候向所有连接的客户端或某个特定客户端发送数据,同时也允许客户端以同样的方式向服务器发送消息。这意味着在不使用轮询的情况下实现了客户端和服务器之间的双向通信 - 一旦建立连接,任何一方都可以在想要的时候向另一方发送信息。

注意: 如果你只需要服务器向客户端发送几条消息,但是客户端不需要能够回应,那么使用 sockets 可能会有些过度(尽管它们肯定仍然可以完成任务)。此时可以考虑使用服务器推送事件 (server sent events)

实际上,你只需要编写一些代码作为后台服务在你的 web 服务器上运行,客户端通过 sockets 连接到它,它会跟踪当前连接的所有人,并可以随时向任何一个人发送/接收消息(通常使用某种无限更新循环来检查是否有变化)。

如何编写/运行 WebSockets?

尽管你使用 PHP 编写其余的后端代码,但并不意味着你的 socket 服务器也必须用 PHP 写 - 它可以使用任何语言编写,尤其是那些内置 socket 支持的语言(比如 Java)。

如果你在 *nix 上运行服务器,并且想要一个适用于任何语言的简单解决方案,那么可以尝试使用websocketd,它使你可以使用任何语言编写 WebSockets 代码,而无需担心任何 socket API。

这个方法让你可以使用stdinstdout进行所有的输入输出,然后你可以在终端中使用websocketd命令运行它,该命令创建了一个守护进程来托管Websocket并允许客户端连接。我发现这是快速启动小型项目的最佳方式,但如果你要制作大型项目(或者计划有很多并发用户),那么自定义解决方案可能更好。

如果你确实喜欢PHP,则还有一种全PHP解决方案,叫做Ratchet。这非常棒,因为如果你已经不知道其他语言,你不需要学习新语言,并且你知道无需安装任何其他软件就可以在服务器上运行它。 Ratchet基于ReactPHP构建,后者也是一种全PHP解决方案,可获得事件驱动的非阻塞IO 。如果你选择这条路,请查看以下链接以开始使用Ratchet或ReactPHP:

一旦你完成了后端,JavaScript有一个完整的WebSocket API可以使用 - 你可以在这里找到更多信息:

如何托管WebSockets?

使用WebSockets进行托管可能有点棘手,因为它需要在主机服务器上不断运行服务。但是,许多服务提供了这样的解决方案。

通常情况下,如果它具有SSH访问权限,则可以制作、配置和运行服务,尽管这并非总是如此。 亚马逊网络服务(AWS) Google App Engine 支持此功能,并且其他一些公司也会支持-您只需要四处寻找即可。您还可以通过这些相同的服务运行自己的服务器,这将使您能够运行上述任何一个库。 需要注意的一点是,您不需要在为您提供Web托管的同一服务器上运行WebSocket服务器。因此,您可以使用任何类型的主机托管您想要的站点/域,然后在AWS或App Engine上提供单独的服务以提供您的Socket服务器。

1
非常优秀,这正是我在寻找的答案。对我非常有帮助。非常感谢你,Toastrackenigma! - user8348171
虽然这个问题因为不符合SO的要求而被关闭,但是答案是100%有帮助的。这个问题在我的Google查询中排名第一。感谢你提供这个全面的答案。结果发现Ratchet是基于ReactPHP构建的。ReactPHP与JS React库没有任何关系。我稍微编辑了你的答案以帮助澄清其中的一些事情。 - FontFamily
最佳答案。 - Jack Tech

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