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

问题描述:

我有一个应用程序正在运行列出的HTTP请求。每个请求被传递到一个框架对象$app被实例化,并且这照顾了路由/控制器/模型等。如何在HTTP请求和cli类对象之间进行通话

现在我有另一个类的对象被实例化通过。一个CLI脚本现在叫它$cliApp现在的问题是我如何让这两个对象相互交谈。每当有新的请求时,$app就会实例化。

$cliApp是当脚本运行实例只有一次。这个脚本通过$loop对象运行在循环中PHP React Event loop

Cli App正在运行websockets。所以基本上我想要通过http &套接字进行通信。 http api。

P.s. :

现在我有一个解决方案使用消息队列例如0mq等,但似乎过度杀伤,因为我不想缩放和保持简单。

我目前正在尝试的另一个解决方案是,在由$http请求创建的线程和由$cli请求创建的线程之间共享SptStorageObject。也许这是依赖注入的问题,我有麻烦分享这个$store对象。

+0

对您的应用程序的每个请求都会在服务器上启动一个新线程。 CLI执行相同的操作。 PHP中的线程永远不会共享任何内容。你需要一个消息传递系统来实现沟通。所以你在正确的轨道上。 – colburton

+0

我不完全确定是否了解有多少进程在这里运行。基本上,你启动一个PHP进程的实例(反应http服务器)和$ cliApp是在这里吗?或者有多个php的实例在这里产生? – Method

+0

@方法我只是使用React Event Loop&Ratchet Websockets。 HTTP请求来自另一个框架,即使用symfony/silex组件。 – kishanio

如果我理解正确的话,你有(假设指出):

  • 正常的PHP的Web应用程序,通过HTTP(大概是在Apache或类似的网络服务器)
  • 长期运行PHP CLI应用传达通过websockets进行通信。

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

我会假设你需要的东西超越了每一个应用程序从持久性数据存储器(或这两个过程使用单独的数据存储)访问的最先进的最新数据,和实际需要导通这两个流程之间的需求沟通。

你在消息队列的正确路径,但正如你所指出的那样,当你已经有两个独立工作的完美的通信层时,添加第三个专用进程间通信层是不必要的复杂性。

您需要的是为您的cli应用程序在需要与您的Web应用程序开始通信时说出HTTP,并在您的Web应用程序需要与您的Cli应用程序启动通信时说出Web套接字。

这在实践中看起来很简单。

在您的CLI应用程序,只需使用卷曲发起HTTP连接到您的网络应用程序。这非常简单,网上有无穷无尽的资源可以帮助你,如果你遇到困难,那么到这里来解决一个新的问题就是你的问题。所有这些都需要在你的web应用程序是这样的:

  • 适当的端点(或多个),其中CLI应用程序可以发送请求到,如果迎面页基本客户端将无法满足
  • 一些方法来验证CLI应用程序是否需要访问不应该提供给Web客户端

为您的Web应用程序启动WebSocket连接到CLI应用程序的数据,这是一个比较复杂一点,因为我不知道任何本地的PHP的功能性,专门针对websocket协议。但是,我确实发现this (extremely permissive) github project可以让您设置Web套接字服务器,并且您可以使用它在您的Web应用程序处理过程中连接到并发送/接收数据,然后在您关闭它时关闭它'重做。它似乎仍然有一些最小的活动,您可以直接使用它或将它用作编写自己的websocket客户端的起点。

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

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