我开发了一些中间件(实际上是抓取工具)并且需要向一个服务器发送~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);
}
它可以工作,但如果我取消注释字符串以检查响应,它就无法工作(挂断)。如果服务器返回错误,我需要检查答案并重新发送请求。我还没有意识到,在这段代码中我可以放置函数,这将把进度条渲染到我的控制台,因为我不清楚,当发送单独的请求时。我希望任何人都已经意识到类似的代码,并能解释我需要改变的地方。感谢。