如何在HTTP请求和cli类对象之间进行通信


How to talk between HTTP request & cli class objects

我有一个正在运行的应用程序,它正在列出HTTP请求。每个请求都传递到单个页面,其中实例化框架对象$app,这负责路由/控制器/模型等。

现在我有另一个类,其对象通过以下方式实例化。 CLI 脚本让我们调用它$cliApp现在的问题是如何使两个对象相互通信。 每次有新请求时都会实例化$app

$cliApp仅在运行脚本时实例化一次。此脚本通过 PHP React Event 循环$loop对象循环运行。

CLI 应用程序正在运行 websockets。所以基本上我希望http和sockets通过a进行通信。HTTP API。

附言 :

现在我有一种解决方案来使用消息队列,例如 0mq 等,但这似乎有点矫枉过正,因为我不想扩展并保持简单。

我目前正在尝试并且感觉正确的另一种解决方案是在请求$http创建的线程和$cli请求创建的线程之间共享 SptStorageObject。也许这是依赖注入的问题,我在共享这个$store对象时遇到了麻烦。

如果我理解正确,你有(假设):

  • 一个通过HTTP进行通信的普通PHP网络应用程序(大概在Apache或类似的网络服务器上)
  • 一个长时间运行的 PHP CLI 应用程序,通过 websocket 进行通信。

据推测,这两个应用程序都在持续接收来自 Web 客户端的通信。 据推测,它们还拥有自己的持久数据存储,例如MySQL数据库或类似数据库,甚至可能共享相同的数据存储。

我将假设您需要的不仅仅是每个应用程序从持久数据存储中访问最新数据(或者两个进程使用单独的数据存储),并且您实际上需要两个进程之间的按需通信。

您在消息队列的正确道路上,但正如您所注意到的,当您已经有两个可以正常工作的通信层时,添加第三个专用的进程间通信层是不必要的复杂性。

你需要的是,CLI 应用在需要启动与 Web 应用的通信

时使用 HTTP,而 Web 应用在需要启动与 CLI 应用的通信时使用网络套接字。

这在实践中看起来相当简单。

在您的 cli 应用程序中,只需使用 cURL 启动与 Web 应用程序的 HTTP 连接。 这相当简单,网络上有无穷无尽的资源可以帮助您,如果您遇到困难,那么带着特定于您的问题的新问题来到这里会让您继续前进。 Web 应用中的所有这些要求如下:

  • CLI 应用可以向其发送请求的适当终结点(如果面向客户端的基本页面不够用)
  • CLI 应用需要访问不应对 Web 客户端可用的数据时对其进行身份验证的某种方法

对于您的 Web 应用程序启动与 cli 应用程序的 websocket 连接,这有点复杂,因为我不知道任何专门针对 websocket 协议的本机 PHP 功能。 但是,我确实发现了这个(非常宽松的)github项目,该项目旨在为您提供设置Web套接字服务器的能力,并且它还包括一个客户端脚本,您可以使用该脚本在Web应用程序进程存在时连接到和发送/接收数据,然后在完成后将其关闭。 它似乎仍然有一些最小的活动,您可以直接使用它或将其用作编写自己的 websocket 客户端的起点。

在这种情况下,就像在相反的情况下一样,您需要 cli 客户端来识别和验证来自 Web 客户端的流量,以便它可以为其提供适当的数据。

如果由于某种原因此方案不适合您,那么您将返回到消息队列或共享数据存储(有人建议使用 redis,在某些情况下可以充当混合数据存储/消息队列)。