异步调用 HTTP 服务的正确方法?

2016-09-28 21:36:47 +08:00
 c3538378

有个较耗时的外部 REST 服务需调用,同时还有查询 MySQL 之类的。

如果多线程的话,可以先创建一个线程调用 REST 、再去查 MySQL 、再把线程 join 。

可是 PHP 的多线程 /Pthreads 好像不靠谱?请问大家有更靠谱的方案吗?

4975 次点击
所在节点    PHP
6 条回复
pubby
2016-09-28 22:00:19 +08:00
如果要同步返回这些结果给请求方,那么大并发下不太适合 php 来做
wesley
2016-09-28 22:11:50 +08:00
curl_multi
gouchaoer
2016-09-28 22:26:18 +08:00
http 异步 php 的 guzzle 支持很好, rpc 的话 yar 也支持的,不需要多线程。。。。另外 php 的多线程是真的多线程,没有全局锁的,所有 pecl 的扩展都分了多线程 /单线程版本的。。。。
c3538378
2016-09-28 23:20:28 +08:00
@wesley 但是其实只有一个 http request , curl_multi 也是要等待吧?

@gouchaoer guzzle 也研究过,貌似也要用个什么 tick https://github.com/guzzle/guzzle/issues/1127 等下试试看
fuxkcsdn
2016-09-29 00:01:44 +08:00
1 , mysql 查询必须等待外部请求返回的结果?
是的话,那多线程也没啥用
不是的话,先查完 mysql 再执行外部请求
2 ,一次请求里,只有一个外部请求?还是多个?
只有一个的话,等待吧,没有其他方法了,多线程也同样要等待
多个的话,可以用 guzzle ,外部请求数固定的话用 promise ,不固定的话用 pool
3 ,是否需要返回响应给请求方?
需要,结合问题 1 , 2
不需要,用任务队列
yueyoum
2016-09-29 18:37:45 +08:00
异步才是未来啊,

发一个 REST 请求, 切出, 让其他代码执行
REST 回来后, 发出 mysql 查询请求, 切出,
mysql 返回后, 此次任务完成.


完. 就是这么简单清晰

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/309625

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX