你需要的是 WebSockets
与 AJAX 不同,在 AJAX 中,您向服务器发送请求,服务器将数据发回,Web 套接字允许服务器在任何给定时间向任何/所有连接的客户端发送数据,并让客户端将消息发送到服务器以同样的方式。这允许客户端和服务器之间进行完全双向通信而无需轮询 - 一旦建立连接,任何一方都可以随时向另一方发送信息。
注意:如果您只需要您的服务器向客户端发送几条消息,但客户端不需要能够响应,那么套接字可能是一种矫枉过正(尽管它们会绝对仍然可以完成工作)。请改用server sent events。
实际上,您编写了一些代码,在您的 Web 服务器的后台作为服务运行,客户端使用套接字连接到它,它跟踪当前连接的每个人,并且可以随时向其中任何人发送/接收消息(通常会使用某种无限更新循环来检查是否有任何变化)。
如何编写/运行 WebSockets?
仅仅因为您用 PHP 编写后端的其余部分并不意味着您的套接字服务器必须是 - 它可以用任何语言编写,尽管具有内置套接字支持(如 Java)的语言可能更好。
如果您在 *nix 上运行您的服务器,并且您想要一个适用于任何语言的非常简单的解决方案,您可能需要查看 websocketd,它可以让您使用任何您想要编写 websocket 代码的语言,而无需担心任何套接字 API。
它允许您使用stdin 和stdout 进行所有I/O,然后您可以使用websocketd 命令在终端中运行它,该命令创建一个托管websocket 并允许客户端连接的守护进程给它。我发现这是我快速启动并快速运行小型项目的首选方法 - 但如果您正在做大事(或计划拥有大量并发用户),那么自定义解决方案可能会更好。
如果您真的喜欢 PHP,还有一个全 PHP 解决方案,也称为 Ratchet。这很棒,因为如果您还不知道一门新语言,您就不需要学习一门新语言,并且您知道您已经能够在您的服务器上运行它而无需任何额外的软件。 Ratchet 是基于 ReactPHP 构建的,它也是一个全 PHP 解决方案,用于获得事件驱动的非阻塞 IO。如果您选择走这条路,ReactPHP 的博客是帮助您入门的有用资源。您可以查看以下链接以开始使用 Ratchet 或 ReactPHP:
一旦您完成了后端,JavaScript 就有一个完整的 WebSocket API 可供您使用 - 您可以在此处找到更多信息:
如何托管 WebSockets?
使用 WebSockets 托管可能会有点痛苦,因为它需要您保持服务在主机服务器上持续运行。但是,有许多服务可以提供这样的解决方案。
通常,如果它具有 SSH 访问权限,则您可以创建、配置和运行服务,尽管并非总是如此。
Amazon Web Services (AWS) 和 Google App Engine 支持这一点,其他一些公司也会支持 - 你只需要四处看看。您还可以通过这些相同的服务运行您自己的服务器,这样您就可以运行上述任何一个库。
要记住的一点是,您不需要在为您提供 Web 托管的同一台服务器上运行 WebSocket 服务器。因此,您可以为您想要的站点/域使用任何类型的托管,然后在 AWS 或 App Engine 上使用单独的服务来提供您的 Socket 服务器。