簡體   English   中英

PHP 中的 cURL 下載進度

[英]cURL download progress in PHP

我對 cURL 很陌生,所以我已經為此苦苦掙扎了好幾個小時。 我正在嘗試使用 cURL 在 iframe 中下載網站的源代碼,並在加載時顯示加載了多少。 到目前為止,我已經成功下載了源代碼,但沒有顯示加載進度。 你能解釋一下如何顯示下載進度嗎? 如果沒有 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); 

你需要的是什么

<?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();

?>

這是回調在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>

您可能對更多示例代碼感興趣

要在類中使用回調,您必須這樣做:

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

我的 web 服務器上的刷新出現問題。 我通過添加解決了它:

    for ($j = 0; $j < 128; $j++) {
        print "<!---------------------------->\n";
    }

在flush()之前,ob_flush()。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM