gpt4 book ai didi

php - 在 php 中获取多 curl 响应时,如何控制接收数据的顺序?

转载 作者:可可西里 更新时间:2023-11-01 17:04:43 26 4
gpt4 key购买 nike

在我的场景中,我可能需要发出 100 多个 curl 请求来获取我需要的信息。没有办法事先获得这些信息,而且我无权访问我将向其发出请求的服务器。我的计划是使用 curl_multi_init() .每个响应都将以 json 格式出现。问题是我需要按照我放置的顺序接收信息,否则我将不知道响应返回后一切都去了哪里。我该如何解决这个问题。

最佳答案

当您从 curl_multi_info_read 获取句柄时,您可以将这些句柄与您的键控列表进行比较,然后当然可以使用键来了解您的响应去向。这是基于我用于抓取工具的模型的直接实现:

// here's our list of URL, in the order we care about
$easy_handles['google'] = curl_init('https://google.com/');
$easy_handles['bing'] = curl_init('https://bing.com/');
$easy_handles['duckduckgo'] = curl_init('https://duckduckgo.com/');

// our responses will be here, keyed same as URL list
$responses = [];

// here's the code to do the multi-request -- it's all boilerplate
$common_options = [ CURLOPT_FOLLOWLOCATION => true, CURLOPT_RETURNTRANSFER => true ];
$multi_handle = curl_multi_init();
foreach ($easy_handles as $easy_handle) {
curl_setopt_array($easy_handle, $common_options);
curl_multi_add_handle($multi_handle, $easy_handle);
}
do {
$status = curl_multi_exec($multi_handle, $runCnt);
assert(CURLM_OK === $status);
do {
$status = curl_multi_select($multi_handle, 2/*seconds timeout*/);
if (-1 === $status) usleep(10); // reported bug in PHP
} while (0 === $status);
while (false !== ($info = curl_multi_info_read($multi_handle))) {
foreach ($easy_handles as $key => $easy_handle) { // find the response handle
if ($info['handle'] === $easy_handle) { // from our list
if (CURLE_OK === $info['result']) {
$responses[$key] = curl_multi_getcontent($info['handle']);
} else {
$responses[$key] = new \RuntimeException(
curl_strerror($info['result'])
);
}
}
}
}
} while (0 < $runCnt);

其中大部分是执行多重提取的样板机制。针对您的特定问题的行是:

foreach ($easy_handles as $key => $easy_handle) { // find the response handle
if ($info['handle'] === $easy_handle) { // from our list
if (CURLE_OK === $info['result']) {
$responses[$key] = curl_multi_getcontent($info['handle']);

遍历您的列表,将返回的句柄与每个存储的句柄进行比较,然后使用相应的键来填写您的响应。

关于php - 在 php 中获取多 curl 响应时,如何控制接收数据的顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53182429/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com