我使用curl_multi_exec()
并行请求多个网站。比方说,URL1
,URL2
和URL3
。只要其中一个网站返回结果,我就可以处理它,然后等待下一个响应。
现在我需要根据请求的响应知道这个结果来自哪个URL。我不能简单地检查响应中的URL,因为可能存在重定向。那么,确定响应来自哪个网址(URL1
,URL2
或URL3
)的最佳方法是什么?来自curl_multi_info_read()
或curl_getinfo()
的信息能以某种方式用于此吗?我可以设置并请求cURL选项吗?
我还尝试在请求URL之前存储cURL处理程序并将它们与curl_multi_info_read($curlMultiHandle)['handle']
进行比较,但由于这是一种资源,因此它并不具有可比性。
有什么想法吗?
答案 0 :(得分:1)
可以附加自定义数据来处理
curl_setopt($handle, \CURLOPT_PRIVATE, json_encode(['id' => $query_id]));
然后获取此数据
curl_getinfo($handle, \CURLINFO_PRIVATE);
答案 1 :(得分: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);
........
}
}
}