如果我理解正确,你有(假设指出):
- 通过 HTTP 进行通信的普通 PHP Web 应用程序(可能在 Apache 或类似的 Web 服务器上)
- 一个长期运行的 PHP cli 应用程序,通过 websockets 进行通信。
大概这两个应用程序都在持续接收来自 Web 客户端的通信。大概他们也有自己的持久性数据存储,例如 MySQL 数据库或类似数据库,甚至可能共享同一个。
我将假设您需要的不仅仅是从持久数据存储访问最新数据的每个应用程序(或者两个进程使用单独的数据存储),并且您实际上需要在两个过程。
您在消息队列方面走在了正确的道路上,但是正如您所注意到的,当您已经拥有两个独立工作的通信层时,添加第三个专用的进程间通信层是不必要的复杂性。
您需要让您的 cli 应用程序在需要启动与您的网络应用程序通信时使用 HTTP,并让您的网络应用程序在需要启动与您的 cli 应用程序通信时使用网络套接字。
这在实践中看起来很简单。
在您的 cli 应用程序中,只需使用 cURL 启动与您的 Web 应用程序的 HTTP 连接。这相当简单,网络上有无穷无尽的资源可以帮助您一路走来,如果您遇到困难,那么带着针对您的问题的新问题来到这里会让您继续前进。您的 Web 应用程序中的所有这些要求如下:
- 如果基本面向客户端的页面不够用,cli 应用程序可以向其发送请求的适当端点
- 如果 cli 应用程序需要访问 Web 客户端不应该可用的数据,则可以使用某种方法对它进行身份验证
对于您的 Web 应用程序来启动与 cli 应用程序的 websocket 连接,它有点复杂,因为我不知道任何专门针对 websocket 协议的本机 PHP 功能。但是,我确实发现了这个(非常宽松的)github 项目,它声称可以让您设置 Web 套接字服务器,并且它还包括一个客户端脚本,您可以使用该脚本在您的 Web 应用程序中连接和发送/接收数据进程存在,然后在完成后将其关闭。它似乎仍然有一些最小的活动,您可以直接使用它或将其用作编写自己的 websocket 客户端的起点。
在这种情况下,就像在相反的情况下一样,您需要 cli 客户端来识别和验证来自 Web 客户端的流量,以便它可以为它提供适当的数据。
如果由于某种原因这种情况对您不起作用,那么您将回到消息队列或共享数据存储(有人建议使用 redis,在某些情况下可以充当混合数据存储/消息队列)。