我需要同时调用大量的API。我试图通过多线程 curl 来实现这一点,但是当我传入很多 URL 时,它似乎无法正确获取所有 API 的结果(有些会出错;我认为这是超时问题?)。每次最多只能传递 50 个 URL,大约在传递 100 个 URL 时就会出现问题。因此,我不得不实现逻辑来分块处理我要同时调用的 URL。
问题: 1. 是什么导致了我的 curl 问题? 2. 在 curl 中是否有设置可以告诉它等待更长时间以获取响应 - 以防我的问题与超时有关? 3. 在我的服务器 / php.ini 中是否有可以配置以提高脚本性能的选项?
以下是脚本代码:
问题: 1. 是什么导致了我的 curl 问题? 2. 在 curl 中是否有设置可以告诉它等待更长时间以获取响应 - 以防我的问题与超时有关? 3. 在我的服务器 / php.ini 中是否有可以配置以提高脚本性能的选项?
以下是脚本代码:
function multithreaded_curl(array $urls, $concurrent_urls = 50)
{
// Data to be returned
$total_results = array();
// Chunk the URLs
$chunked_urls = array_chunk($urls, $concurrent_urls);
foreach ($chunked_urls as $chunked_url) {
// Chunked results
$results = array();
// Array of cURL handles
$curl_handles = array();
// Multi-handle
$mh = curl_multi_init();
// Loop through $chunked_urls and create curl handles, then add them to the multi-handle
foreach ($chunked_url as $k => $v) {
$curl_handles[$k] = curl_init();
curl_setopt($curl_handles[$k], CURLOPT_URL, $v);
curl_setopt($curl_handles[$k], CURLOPT_HEADER, 0);
curl_setopt($curl_handles[$k], CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl_handles[$k], CURLOPT_SSL_VERIFYPEER, 0);
curl_multi_add_handle($mh, $curl_handles[$k]);
}
// Execute the handles
$running = NULL;
do {
curl_multi_exec($mh, $running);
} while ($running > 0);
// Get content and remove handles
foreach ($curl_handles as $k => $v) {
$results[$k] = json_decode(curl_multi_getcontent($v), TRUE);
curl_multi_remove_handle($mh, $v);
}
// All done
curl_multi_close($mh);
// Combine results
$total_results = array_merge($total_results, $results);
}
return $total_results;
}
curl_multi_exec
不是多线程的吗?set_time_limit(0);
。curl_getinfo()
和curl_error()
以获取更多详细信息。如果没有看到这些,我们甚至不知道它为什么会失败。除此之外,您可能会受到速率限制,一些服务器可能会阻止来自单个IP的超过x
个同时连接,您的操作系统可能会遭受套接字或描述符耗尽的问题。如果您正在为API请求访问大量相同的主机,则更有效的方法是重复使用相同的cURL句柄,以利用服务器支持的保持活动连接。 - drew010