Определите конкретный завиток мульти-ответа
Я использую curl_multi_exec()
запрашивать несколько сайтов параллельно. Сказать, URL1
, URL2
, а также URL3
, Как только один из этих веб-сайтов возвращает результат, я могу обработать его, а затем дождаться следующего ответа.
Теперь мне нужно знать, на основании ответа на запрос, с какого URL пришел этот результат. Я не могу просто проверить URL из ответа, так как могут быть перенаправления. Итак, каков наилучший способ определить, с какого URL (URL1
, URL2
, или же URL3
) ответ пришел? Может информация от curl_multi_info_read()
или же curl_getinfo()
как-то использовать для этого? Есть ли опция cURL, которую я могу установить и запросить для этого?
Я также попытался сохранить обработчики cURL перед запросом URL-адресов и сравнить их с curl_multi_info_read($curlMultiHandle)['handle']
но поскольку это ресурс, он не совсем сопоставим.
Есть идеи?
2 ответа
Можно прикрепить пользовательские данные для обработки
curl_setopt($handle, \CURLOPT_PRIVATE, json_encode(['id' => $query_id]));
а затем получить эти данные
curl_getinfo($handle, \CURLINFO_PRIVATE);
Предположим, у вас есть несколько объектов Image, для которых вам нужно загрузить данные. Вы выполняете свои запросы параллельно и не знаете порядок завершения загрузки. Таким образом, вы должны как-то идентифицировать ваш конкретный объект Image при получении данных. Вместо использования URL-адресов (которые могут измениться после перенаправления) в качестве ключей в ассоциативном массиве объектов Image, я рекомендую следующий простой подход.
$mh = curl_multi_init();
$activeHandles = array();
$loadingImages = array();
function loadImage(Image $image) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $image->getUrl());
curl_multi_add_handle($mh, $ch);
...
$this->loadingImages[] = $image;
$activeHandles[] = $ch;
}
function retrieveImages() {
// Somewhere you run curl_multi_exec($mh, $running).
// Here you get the results.
while ($result = curl_multi_info_read($mh)) {
// How to get the data is out of our scope.
// We are interested in identifying the image object.
$ch = $result['handle'];
$idx = array_search($ch, $activeHandles);
$image = $loadingImages[$idx];
if ($success) {
// Don't remember to free resources!
unset($activeHandles[$idx]);
unset($loadingImages[$idx]);
curl_multi_remove_handle($mh, $ch);
........
}
}
}