19

私はcURLにかなり慣れていないので、これに何時間も苦労しています。cURLを使用してiframeにWebサイトのソースをダウンロードしようとしています。ロード中に、ロードされている量を表示します。これまでのところ、読み込みの進行状況を表示せずにソースを正常にダウンロードできました。ダウンロードの進行状況を表示する方法を説明できますか?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); 
4

3 に答える 3

31

必要なのは

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

?>
于 2012-12-19T18:17:53.040 に答える
7

これは、コールバックが 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)

したがって、iframe に .php ファイルをロードする page.html があると仮定します。

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>

いくつかのサンプルコードに興味があるかもしれません

于 2012-12-19T18:11:25.997 に答える