php实现异步请求

在做A事情的时候,如果符合某条件,则需要另外做一件比较耗时的B事情,B的结果不需要返回给用户,所以考虑用异步方式来做B。这样改如何用异步实现啊

阅读 6.2k
6 个回答

swoole、workman擁有異步功能模塊.

其實我覺得你這種不是用異步去滿足,既然不需要返回給用戶,那麼其實不需要及時將滿足A條件的內容交給B去處理。就是可以使用隊列+自動化處理,將所有滿足A丟入隊列。跟住使用自動化將定量的隊列數據執行B處理。這個可以減少系統資源的使用

新手上路,请多包涵

我来回答一下吧,排除swoole,zanphp这种异步框架来说,常规的实现方式。

while(true) {
sleep(1);
}

以上是一个死循环,对,你没看错,然后在这里面写上事务处理的代码,稍后说,先说关于这个死循环的管理。
这个死循环是必须常住后台进程的,所以采用supervisor(自行百度)来自行这段PHP代码,相当于做进程管理,用supervisor来启动这这段PHP代码是以命令行模式运行的。

然后,接下来说队列处理思路:

  1. 把要处理的事务加入到redis或者mysql,总之有个东西存这段信息就好了,这个信息主要包括自行那个程序,如哪个控制器的哪个方法,或者哪个模型的哪个方法;

  2. 在while(true)队列里实现的是,间隔1秒从存储的数据里取出队列,根据存储的信息进行自行指定的程序,当然,自行的这个方法如果有参数,那么写入存储的队列信息里也要进行存储,自行队列的时候也就可以根据这个信息进行传参和处理了。
    这就是整个异步队列的实现思路,也就是说正常的业务执行的时候只要写入信息就好了,然后事务执行逻辑就采用常驻进程的PHP程序去查询要执行的东西进行执行,也就是异步的了(具体业务逻辑不需要等待,不同步)。

最简单的方式是把A触发的B任务存到redis等缓存中,然后让脚本来执行B任务。不需要使用PHP直接实现异步

1、消息队列来处理
2、异步框架 swoole来解决

如果结果要返回给用户,用异步或者协程挺好.
但是你结果不需要返回给用户, 这个直接搞个队列最方便.

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题