0

ファイルをダウンロードするためにphpを使用したプログラムに取り組んでいます。スクリプト要求は次のようなものです: PHP を使用してファイルを送信するときに、再開可能なダウンロードにhttp://localhost/download.php?file=abc.zip 記載されているスクリプトを使用しますか?

マルチスレッドまたはシングルスレッドのダウンロードのいずれかで、300M 未満のファイルに対しては確実に機能しますが、300M を超えるファイルをダウンロードしようとすると、シングルスレッドのダウンロードで問題が発生し、約250Mのデータしかダウンロードできませんでした。 http 接続が切断されました。ブレークポイントで壊れません..なぜですか?スクリプトをデバッグして、壊れた場所を特定しました。

$max_bf_size = 10240;
$pf = fopen("$file_path", "rb");
fseek($pf, $offset);
while(1)
{
    $rd_length = $length < $max_bf_size? $length:$max_bf_size;
    $data = fread($pf, $rd_length);
    print $data;
    $length = $length - $rd_length;
    if( $length <= 0 )
    {
        //__break-point__ 
        break;
    }

}

これは、要求されたすべてのドキュメントが 250M データ バッファしか取得できないように見えechoますprintが、マルチスレッドを使用してファイルをダウンロードすると機能します

4

1 に答える 1

0

fread() は要求されたバイト数まで読み取るため、読み取るバイト数を計算する不必要な作業を行っています。シングルスレッドとマルチスレッドのダウンロードの意味がわかりません。ファイル全体をダンプする readfile() について知っていますか? $offset から $length バイトまでのファイルの一部を読み取る必要があると思いますよね?

該当する場合は、Web サーバー (Apache?) の構成と ISP の制限も確認します。最大応答サイズまたは時間が調整される場合があります。

これを試して:

define(MAX_BUF_SIZE, 10240);
$pf = fopen($file_path, 'rb');
fseek($pf, $offset);
while (!feof($pf)) {
    $data = fread($pf, MAX_BUF_SIZE);
    if ($data === false)
        break;
    print $data;
}
fclose($pf);
于 2011-01-22T09:07:01.790 に答える