3

URL からサーバーへの再開可能なファイルのダウンロードには、php スクリプトが必要です。ダウンロードを開始し、スナップすると (30 秒から 5 分) 再開し、ファイル全体が完了するまで続きます。

perl http://curl.haxx.se/programs/download.txtに似たようなものがありますが、phpでやりたいのですが、perlがわかりません。

CURLOPT_RANGEチャンクをダウンロードfopen($fileName, "a")し、サーバー上のファイルに追加するために使用すると思います。

これが私の試みです:

<?php

function run()
{
    while(1)
    {
         get_chunk($_SESSION['url'], $_SESSION['filename']);
         sleep(5);
         flush();
    }    
}

function get_chunk( $url, $fileName)
{

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

    if (file_exists($fileName)) {
        $from = filesize($fileName);
        curl_setopt($ch, CURLOPT_RANGE, $from . "-");//maybe "-".$from+1000 for 1MB chunks
    }

    $fp = fopen($fileName, "a");
    if (!$fp) {
        exit;
    }
    curl_setopt($ch, CURLOPT_FILE, $fp);
    $result = curl_exec($ch);
    curl_close($ch);

    fclose($fp);

}

?>
4

2 に答える 2

0

不安定な接続を介してファイルをダウンロードすることを目的としている場合は、エラーが発生した場合にダウンロードを自動的に再試行し、中断したところから続行curlするフラグがあります。--retry残念ながら、 libcurlにもそのオプションがないため、 PHPライブラリにはそのオプションがないようです。

通常、外部コマンドではなくライブラリを使用することをお勧めしますが、独自のコマンドをロールするよりも、この場合は単に呼び出すcurl --retrycurl -C -、コマンドラインで実行する方が簡単な場合があります。 wget -c別のオプションです。

そうでなければ、常にデータをチャンクで取得する必要はないと思います。できるだけ多くダウンロードし、エラーが発生した場合は、CURLOPT_RANGEと現在のファイルサイズを使用して再開します。

于 2012-10-21T00:54:39.980 に答える