【问题标题】:cURL download progress in PHPPHP中的cURL下载进度
【发布时间】:2012-12-07 03:42:33
【问题描述】:

我对 cURL 很陌生,所以我已经为此苦苦挣扎了好几个小时。我正在尝试使用 cURL 在 iframe 中下载网站的源代码,并在加载时显示加载了多少。到目前为止,我已经成功下载了源代码,但没有显示加载进度。你能解释一下如何显示下载进度吗?如果没有 cURL,我会逐字节读取文件,然后将下载的字节总数除以文件的总大小。由于 cURL 将源作为一个整体读取,因此如何在 cURL 中完成此操作? (至少我认为这是唯一的方法,不确定)这是我到目前为止所得到的:

/* Download source */
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $adress);  
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, 0); 
curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
$html = curl_exec($ch);
curl_close($ch); 

【问题讨论】:

  • 您是在终端还是网络浏览器中执行脚本?对于网络浏览器,您将需要 javascript。
  • 在网络浏览器中 - 在 iframe 中打印网页源
  • 我相信 this 基于 PHP 的下载加速器是你想要的。

标签: php curl


【解决方案1】:

这是回调在 C 中的样子:

typedef int (*curl_progress_callback)(void *clientp,
                                      double dltotal,
                                      double dlnow,
                                      double ultotal,
                                      double ulnow);

可能在 PHP 中应该是这样的

curl_progress_callback($clientp, $dltotal, $dlnow, $ultotal, $ulnow)

所以,假设您有 page.html,它在 iframe 中加载了一个 .php 文件。

在您的 php 脚本中,您将需要以下函数:

curl_setopt($curl, CURLOPT_PROGRESSFUNCTION, 'curl_progress_callback');    
curl_setopt($curl, CURLOPT_BUFFERSIZE,64000);    
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);

应该产生类似于以下的输出:

0
0.1
0.2
0.2
0.3
0.4
...

然后在 iframe 页面上,你会有一个进度条

<div id="progress-bar">
    <div id="progress">0%</div>
</div>

CSS 应该是这样的

#progress-bar {
    width: 200px;
    padding: 2px;
    border: 2px solid #aaa;
    background: #fff;
}

#progress {
    background: #000;
    color: #fff;
    overflow: hidden;
    white-space: nowrap;
    padding: 5px 0;
    text-indent: 5px;
    width: 0%;
}

JavaScript

var progressElement = document.getElementById('progress')

function updateProgress(percentage) {
    progressElement.style.width = percentage + '%';
    progressElement.innerHTML = percentage + '%';
}

您可以让它输出 JavaScript 并让它为您更新进度条,例如:

<script>updateProgress(0);</script>
<script>updateProgress(0.1);</script>
<script>updateProgress(0.2);</script>

您可能对更多example code 感兴趣

【讨论】:

  • 为什么回调函数有不同的名字?我假设 curl_setopt($curl, CURLOPT_PROGRESSFUNCTION, 'callback');应该是 curl_setopt($curl, CURLOPT_PROGRESSFUNCTION, 'curl_progress_callback');对吗?
【解决方案2】:

你需要的是

<?php
ob_start();

echo "<pre>";
echo "Loading ...";

ob_flush();
flush();

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://stackoverflow.com");
//curl_setopt($ch, CURLOPT_BUFFERSIZE,128);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_PROGRESSFUNCTION, 'progress');
curl_setopt($ch, CURLOPT_NOPROGRESS, false); // needed to make progress function work
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
$html = curl_exec($ch);
curl_close($ch);


function progress($resource,$download_size, $downloaded, $upload_size, $uploaded)
{
    if($download_size > 0)
         echo $downloaded / $download_size  * 100;
    ob_flush();
    flush();
    sleep(1); // just to see effect
}

echo "Done";
ob_flush();
flush();

?>

【讨论】:

  • 它工作正常,但是有一堆错误,在进度函数中有一个被零除的错误。也许当下载的大小为 0 时?
  • 注意:ob_flush() [ref.outcontrol]:刷新缓冲区失败。没有要刷新的缓冲区。在第 7 行的 C:\Users\mr.v\my sites_vlab\test-php-progress-bar\test1.php 注意:ob_flush() [ref.outcontrol]:刷新缓冲区失败。没有要刷新的缓冲区。在第 26 行的 C:\Users\mr.v\my sites_vlab\test-php-progress-bar\test1.php 有什么问题吗?
【解决方案3】:

要在类中使用回调,你必须这样做:

curl_setopt($ch, CURLOPT_PROGRESSFUNCTION, array($this, 'progress'));

或者如果使用静态函数,像这样:

curl_setopt($ch, CURLOPT_PROGRESSFUNCTION, array('self', 'progress'));

... 到一个回调函数来做任何你需要的事情:

private static function progress($resource, $downloadSize, $downloaded, $uploadSize, $uploaded)
{
    // emit the progress
    Cache::put('download_status', [
        'resource' => $resource,
        'download_size' => $downloadSize,
        'downloaded' => $downloaded,
        'upload_size' => $uploadSize,
        'uploaded' => $uploaded
    ], 10);
}

【讨论】:

    猜你喜欢
    • 2015-03-30
    • 2010-12-28
    • 2014-04-30
    • 1970-01-01
    • 2018-04-03
    • 1970-01-01
    • 2014-04-05
    • 2013-01-10
    • 1970-01-01
    相关资源
    最近更新 更多