2

我曾经curl_multi_exec()同时请求多个网站。说,URL1URL2URL3。只要其中一个网站返回结果,我就可以对其进行处理,然后等待下一个响应。

现在我需要知道,根据请求的响应,这个结果来自哪个 URL。我不能简单地从响应中检查 URL,因为可能存在重定向。那么识别响应来自哪个 URL(、、或)的最佳方法是URL1什么URL2URL3信息可以来自curl_multi_info_read()curl_getinfo()以某种方式用于此目的吗?是否有我可以设置和请求的 cURL 选项?

我还尝试在请求 URL 之前存储 cURL 处理程序并将它们与它们进行比较,curl_multi_info_read($curlMultiHandle)['handle']但由于这是一种资源,因此无法真正进行比较。

有任何想法吗?

4

2 回答 2

2

可以附加自定义数据来处理

curl_setopt($handle, \CURLOPT_PRIVATE, json_encode(['id' => $query_id]));

然后获取此数据

curl_getinfo($handle, \CURLINFO_PRIVATE);
于 2015-08-03T12:30:16.303 回答
0

假设您有多个 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);
          ........
        }
      }
    }
于 2013-11-12T07:11:31.997 回答