gpt4 book ai didi

php - 多线程 Curl 无法处理大量并发 URL?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:37:56 25 4
gpt4 key购买 nike

我必须同时调用大量 API。我正在尝试通过多线程 curl 来执行此操作,但它似乎无法正确获取所有 API 结果(出现一些错误;我认为它超时了???)如果我传递了很多 URL .一次 50 个 URL 似乎是我可以传递的最大值,一次大约 100 个是我真正开始看到问题的时候。因此,我不得不实现逻辑来分块我在给定时间尝试 curl 的 URL。

问题:

  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;
}

最佳答案

关于问题 1:如前所述,有几种方法可以解决该算法的问题。首先是它可能会耗尽本地(句柄等)和远程(maxConnections、maxThreads 等)资源。不要那样做。

关于Q2:您不需要(见下文),但请在猜测错误之前获取错误响应。

关于问题 3:是的,根据远程网络服务器的供应商,远程网络服务器有多个选项(线程数限制、最大连接数、每个客户端的最大连接数等)。如果这也是您的服务器,您可以调整它们以更好地满足您的需求,但首先您应该调整客户端算法。

总的来说,一次启动多个连接没有多大意义。连接重用要快得多,并且不会破坏您的本地句柄等,并且不会对远程系统进行 DOS 攻击。这样做的唯一原因是服务器处理请求的时间比 io 需要的时间长。

当您一次假设 4 个连接并重用它们而不是创建新连接时,您是否检查过速度?事实上,您正在填充 curl_handles[] 以供每次使用。创建 IO 对象需要时间。

关于php - 多线程 Curl 无法处理大量并发 URL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35542297/

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