使用HTTP / 2的所有现代功能从PHP执行~500个查询

时间:2017-11-27 06:51:44

标签: php curl h2 multiplexing

我开发了一些中间件(实际上是抓取工具)并且需要向一个服务器发送~500个POST请求以接收答案。服务器支持HTTP / 2。我使用带有libcurl / 7.53.1的PHP 7.1,即所有版本都适用。

如何使用HTTP / 2的所有现代功能从PHP快速执行~500个查询?我用通常重用的curl句柄编写了很多脚本,但实际上并不了解多路复用的类似处理响应需要什么。

我的代码:

$mh = curl_multi_init();
$chs = array();
$active = 0;
curl_multi_setopt($mh, CURLMOPT_PIPELINING, 1);
curl_multi_setopt($mh, CURLMOPT_MAXCONNECTS, 8);

$res = array();
$portals = array();

for ($i=0; $i<count($tiles); $i++) {
    $post = json_encode($tile_data);
    $ch = curl_init();
    $options = array(
        CURLOPT_URL => "https://www.example.com/v1/getTile",
        CURLOPT_POST => true,
        CURLOPT_POSTFIELDS => $post,
        CURLOPT_RETURNTRANSFER => 1,
        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_2_0
    );
    curl_setopt_array($ch, $options);
    $chs[$tiles[$i]] = $ch;
    curl_multi_add_handle($mh, $ch);
}

do {
    $mrc = curl_multi_exec($mh, $active);
} while ($active > 0);

for ($i=0; $i<count($tiles); $i++) {
    $ch = $chs[$tiles[$i]];
#    $req_ok = false;
#    while ($req_ok == false) {
        $raw = curl_multi_getcontent($ch);
        $data = json_decode($raw, true);
#        if (isset($data['result']['map'][$tiles[$i]]['entities'])) {
#            $req_ok = true;
            curl_multi_remove_handle($mh, $ch);
#        }
#    }
    array_push($res, $data);
}

它可以工作,但如果我取消注释字符串以检查响应,它就无法工作(挂断)。如果服务器返回错误,我需要检查答案并重新发送请求。我还没有意识到,在这段代码中我可以放置函数,这将把进度条渲染到我的控制台,因为我不清楚,当发送单独的请求时。我希望任何人都已经意识到类似的代码,并能解释我需要改变的地方。感谢。

0 个答案:

没有答案