Определите конкретный завиток мульти-ответа

Я использую 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);
          ........
        }
      }
    }
Другие вопросы по тегам