如何在HTTP请求和& cli类对象

时间:2016-04-25 08:16:24

标签: php oop design-patterns zeromq reactphp

我有一个应用程序运行该列表到HTTP请求。每个请求都被传递到单个页面,其中框架对象$app被实例化,这将处理路由/控制器/模型等。

现在我有另一个类,其对象通过实例化。 CLI脚本现在可以调用它$cliApp问题是如何使对象相互通信。每当有新请求时,$app就会实例化。

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

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

P.S。 :

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

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

1 个答案:

答案 0 :(得分:3)

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

  • 通过HTTP进行通信的普通PHP Web应用程序(可能是在Apache或类似的Web服务器上)
  • 一个长期运行的PHP cli应用程序,通过websockets进行通信。

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

我将假设您需要的内容超出每个应用程序访问持久数据存储中最新的数据(或者两个进程使用单独的数据存储),并且您实际需要 - 两个进程之间的需求通信。

您正在使用消息队列的正确路径,但正如您所指出的那样,当您已经拥有两个可用的通信层时,添加第三个专用进程间通信层会带来不必要的复杂性完全没问题。

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

在实践中看起来很简单。

在您的cli应用中,只需使用cURL启动与您的网络应用的HTTP连接即可。这很简单,网上有无穷无尽的资源可以帮助你一路走来,如果你遇到困难,那么带着一个针对你的问题的新问题来这里会让你前进。您的网络应用程序中所需的所有内容如下:

  • cli应用程序可以向其发送请求的适当端点(如果基本客户端面向页面已经足够)
  • 如果需要访问Web客户端无法访问的数据,请对cli应用进行身份验证的方法

对于您的Web应用程序启动与cli应用程序的websocket连接,它有点复杂,因为我不知道任何专门针对websocket协议的本机PHP功能。但是,我确实发现this (extremely permissive) github project旨在使您能够设置Web套接字服务器,并且also includes a client script可用于在Web应用程序进程生效期间连接并发送/接收数据,当你完成后关闭它。它似乎仍然有一些最小的活动,您可以直接使用它或使用它作为编写您自己的websocket客户端的起点。

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

如果由于某种原因这种情况不适合你,那么你就回到了消息队列或共享数据存储(有人建议使用redis,它可以作为一些混合数据存储/消息队列)的情况下)。