4

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

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

但是$cliApp在运行脚本时只实例化一次。该脚本通过PHP React Event loop$loop的对象循环运行。

Cli 应用程序正在运行 websockets。所以基本上我希望通过 http 和套接字进行通信。http api。

附言:

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

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

4

1 回答 1

3

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

  • 通过 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,在某些情况下可以充当混合数据存储/消息队列)。

于 2016-04-28T20:21:31.107 回答