Я разрабатываю некоторое промежуточное программное обеспечение (фактически инструмент для очистки) и мне нужно отправить ~ 500 запросов POST на один сервер для получения ответов. Сервер поддерживает HTTP / 2. Я использую PHP 7.1 с libcurl / 7.53.1, то есть все версии подходят.
Как быстро выполнить ~ 500 запросов из PHP, используя все современные возможности HTTP / 2? Я написал много скриптов с обычным повторным использованием ручки 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);
}
Это работает, но если я раскомментирую строки для проверки ответа, это больше не работает (зависание). Мне нужно проверить ответы и отправить запрос, если сервер вернул что-то не так. Также я не знаю, где в этом коде я могу поставить функцию, которая будет отображать прогрессбар для моей консоли, потому что мне не ясно, когда отправляются отдельные запросы. Я надеюсь, что кто-нибудь уже реализовал подобный код и может объяснить мне, что мне нужно изменить. Благодарю.
Задача ещё не решена.
Других решений пока нет …