紧急:webman如果实现同时并发访问多个第三方接口

webman_fans

如题,使用curl_multi 可以实现,不过有人为指定耗时。

业务需要同时请求多个第三方,看谁先返回。然后判断结果,如果不正确,再等待第二快返回的,直到结果正确。

然后,处理接下来的业务。

1690 2 1
2个回答

walkor

推荐 curl_multi

  • webman_fans 2022-02-22

    大佬,除了 curl_multi,还有其他方法可以显示这种业务需求吗; 同行都是 golang 的 协程实现的。php目前好像还不行。如何实现?在线等。

  • webman_fans 2022-02-22

    另外,还有一个问题,curl_multi,会人为显示的设置usleep。 而业务需要及时返回的。否则就会超时,下游有200毫秒的超时,限制。现在有大量的超时数据。

  • webman_fans 2022-02-22

    1 最好的结果就是,用php 本身的语言特性实现;
    2 用webman的自身机制,实现这个需求。应该如何实现?不确定webman 框架能否实现? workerman 能否实现。好像 swool 可以实现,

    3 如果swool 可以实现,那就在webman中引入swool来达到目的,应该如果做?

    4 比较紧急。

  • walkor 2022-02-22

    用 curl_multi 是最简单的方案

  • six 2022-02-22

    curl_multi 不用设置usleep

  • yzh52521 2022-02-22

    GuzzleHttp 这个类库有并发请求

  • webman_fans 2022-02-22

    好的,试试

six
<?php
$urls = array(
   "http://lxr.php.net/",
   "http://www.php.net/",
);
$mh = curl_multi_init();
foreach ($urls as $i => $url) {
    $conn[$i] = curl_init($url);
    curl_setopt($conn[$i], CURLOPT_RETURNTRANSFER, 1);
    curl_multi_add_handle($mh, $conn[$i]);
}

do {
    $status = curl_multi_exec($mh, $active);
    $info = curl_multi_info_read($mh);
    if (false !== $info) {
       $result = curl_multi_getcontent($info['handle']);
       // 这里获得每个cul的结果,如果结果是想要的就返回,不是就等下一个结果
       echo $result;
       //return $result;
    }
} while ($status === CURLM_CALL_MULTI_PERFORM || $active);

foreach ($urls as $i => $url) {
    curl_close($conn[$i]);
}

这个是并发执行的,哪个结果先返回就用哪个

年代过于久远,无法发表回答
🔝