V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
c3538378
V2EX  ›  PHP

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

  •  
  •   c3538378 · 2016-09-28 21:36:47 +08:00 · 4971 次点击
    这是一个创建于 3003 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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


    完. 就是这么简单清晰
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5792 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 01:40 · PVG 09:40 · LAX 17:40 · JFK 20:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.