【问题标题】:How to calculate download speed with cURL progress_callback (PHP)如何使用 cURL progress_callback (PHP) 计算下载速度
【发布时间】:2014-05-22 17:15:06
【问题描述】:

我正在使用cURL 通过给定的 URL 上传文件。 (用户提供网址,我的服务器下载文件)

对于进度条,我使用CURLOPT_PROGRESSFUNCTION 选项。 我希望进度的功能也可以计算下载速度,以及还剩多少时间。

$fp = fopen($temp_file, "w");
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_NOPROGRESS, false );
curl_setopt($ch, CURLOPT_PROGRESSFUNCTION, "curl_progress_callback");
curl_setopt($ch, CURLOPT_FILE, $fp);
$success = curl_exec($ch);
$curl_info = curl_getinfo($ch);
curl_close($ch);
fclose($fp);

function curl_progress_callback ($download_size, $downloaded_size, $upload_size, $uploaded_size) {
    global $fileinfo;
    if (!$downloaded_size) {
        if (!isset($fileinfo->size)) {
            $fileinfo->size = $download_size;
            event_callback(array("send" => $fileinfo));
        }
    }
    event_callback(array("progress" => array("loaded" => $downloaded_size, "total" => $download_size)));
}

谢谢!对不起我的英语

【问题讨论】:

  • @CarstenHellweg 我不认为你理解我的问题。回调函数工作正常。我想要的是计算文件下载到服务器的速度,并为下载留出很多时间。

标签: php curl upload download-speed


【解决方案1】:

curl_exec之前添加这个:

$startTime = $prevTime = microtime(true);
$prevSize = 0;

您可以通过将其添加到回调函数来计算平均速度和当前速度以及剩余时间:

$averageSpeed = $downloaded_size / (microtime(true) - $startTime);

$currentSpeed = ($downloaded_size - $prevSize) / (microtime(true) - $prevTime);
$prevTime = microtime(true);
$prevSize = $downloaded_size;

$timeRemaining = ($downloaded_size - $download_size) / $averageSpeed;

速度以字节/秒为单位,剩余时间以秒为单位。

【讨论】:

  • 这行告诉我PHP Warning: Division by zero$currentSpeed = ($downloaded_size - $prevSize) / (time() - $prevTime);
  • @ArielAharonson 嗯,我应该更好地检查代码。请检查更新的答案。
  • 谢谢!现在可以了。顺便说一句:是否可以减少函数curl_progress_callback 的运行次数?例如,如果函数在一秒钟内运行 100 次,是否有可能使其达到 50 次?
  • @ArielAharonson 您可以通过使用curl_setoptCURLOPT_BUFFERSIZE 更改为更高的值来做到这一点。
  • 它会影响其他什么,还是只影响函数重复率?
猜你喜欢
  • 1970-01-01
  • 2011-05-16
  • 2010-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-02
  • 1970-01-01
相关资源
最近更新 更多