微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

但是,当运行脚本时,$cliApp只会实例化一次.此脚本在PHP React Event loop之前通过$loop对象循环运行.

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

附: :

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

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

解决方法

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

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

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

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

您正在使用消息队列的正确路径,但正如您所指出的那样,当您已经拥有两个完全可以正常工作的通信层时,添加第三个专用进程间通信层是不必要的复杂性.

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

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

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

>如果面向基本客户端的页面不够用,cli应用程序可以向其发送请求的适当端点
>如果需要访问Web客户端不可用的数据,请对cli应用程序进行身份验证

对于您的Web应用程序启动与cli应用程序的websocket连接,它有点复杂,因为我不知道任何专门针对websocket协议的本机PHP功能.但是,我确实发现this (extremely permissive) github project声称能够设置网络套接字服务器,并且它可以用来连接到Web应用程序进程并发送/接收数据,然后在您关闭时将其关闭’重做.它似乎仍然有一些最小的活动,您可以直接使用它或使用它作为编写您自己的websocket客户端的起点.

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐