gpt4 book ai didi

php - CURL 问题(多)

转载 作者:行者123 更新时间:2023-12-02 07:32:54 25 4
gpt4 key购买 nike

我遇到了 curl_multi_* 的问题,我想创建一个类/函数,它接收 1000 个 URL,并一次处理所有这些 URL 5,因此当 URL 完成下载时,它会将现在可用的插槽分配给尚未处理的新 URL还没有。

我见过some implementations的curl_multi,但它们都不允许我做我想做的事,我相信解决方案在于使用 curl_multi_select 的某个地方但文档不是很清楚,用户注释也没有多大帮助。

任何人都可以为我提供一些如何实现此类功能的示例吗?

最佳答案

这是一种方法。该脚本将一次获取任意数量的 URL,并在每个 URL 完成后添加一个新 URL(因此它始终获取 $maxConcurrent 页)。

$sites = array('http://example.com', 'http://google.com', 'http://stackoverflow.com');
$concurrent = 2; // Any number.

$mc = new MultiCurl($sites, $concurrent);
$mc->process();

echo '</pre>';

class MultiCurl
{
private $allToDo;
private $multiHandle;
private $maxConcurrent = 2;
private $currentIndex = 0;
private $info = array();
private $options = array(CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_MAXREDIRS => 3,
CURLOPT_TIMEOUT => 3);

public function __construct($todo, $concurrent)
{
$this->allToDo = $todo;
$this->maxConcurrent = $concurrent;
$this->multiHandle = curl_multi_init();
}

public function process()
{
$running = 0;
do {
$this->_addHandles(min(array($this->maxConcurrent - $running, $this->_moreToDo())));
while ($exec = curl_multi_exec($this->multiHandle, $running) === -1) {
}
curl_multi_select($this->multiHandle);
while ($multiInfo = curl_multi_info_read($this->multiHandle, $msgs)) {
$this->_showData($multiInfo);
curl_multi_remove_handle($this->multiHandle, $multiInfo['handle']);
curl_close($multiInfo['handle']);
}
} while ($running || $this->_moreTodo());
return $this;
}

private function _addHandles($num)
{
while ($num-- > 0) {
$handle = curl_init($this->allToDo[$this->currentIndex]);
curl_setopt_array($handle, $this->options);
curl_multi_add_handle($this->multiHandle, $handle);
$this->info[$handle]['url'] = $this->allToDo[$this->currentIndex];
$this->currentIndex++;
}
}

private function _moreToDo()
{
return count($this->allToDo) - $this->currentIndex;
}

private function _showData($multiInfo)
{
$this->info[$multiInfo['handle']]['multi'] = $multiInfo;
$this->info[$multiInfo['handle']]['curl'] = curl_getinfo($multiInfo['handle']);
//print_r($this->info[$multiInfo['handle']]);
$content = curl_multi_getcontent($multiInfo['handle']);
echo $this->info[$multiInfo['handle']]['url'] . ' - ' . strlen($content) . ' bytes<br />';
//echo htmlspecialchars($content);
}
}

关于php - CURL 问题(多),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1387235/

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