2

コードを持つサーバーBを介してサーバーCにファイル(1GB)をダウンロードしようとしています:

header("Content-Disposition: attachment; filename=How to Use Git and GitHub Videos.zip");
header("Content-type: application/octet-stream");
header("Content-Transfer-Encoding: binary");

$url = "http://zips.udacity-data.com/ud775/How%20to%20Use%20Git%20and%20GitHub%20Videos.zip";

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_BUFFERSIZE, 256);

curl_exec ($ch);
curl_close($ch);

私は、ファイルのダウンロードを一時的に開始することを期待していました。しかし、代わりに、ブラウザウィンドウが保存場所を尋ねるまで、長い間待たなければなりません。ファイルのチャンクをチャンクごとに転送することを意味すると思っcurl_setopt($ch, CURLOPT_BUFFERSIZE, 256);たので、最初にすべてのファイルを読み取るのを待つ必要はありません。

では、なぜダウンロードの開始に時間がかかるのでしょうか。どうすれば修正できますか?この方法が間違っている場合は、別の方法を提案してください

4

1 に答える 1

1

これcurl_exec()は、完全な応答を読み取るまでブロックするためです (この場合、プロセスで 1 GB のメモリを消費します)。ただし、独自の関数を呼び出すようにすることもできます。

curl_setopt($ch, CURLOPT_WRITEFUNCTION, function($ch, $buffer) {
  echo $buffer;
  return strlen($buffer);
});
curl_exec ($ch); // curl will call CURLOPT_WRITEFUNCTION as it receives data inside curl_exec()

CURLOPT_RETURNTRANSFERfalse にも true にも設定されていないことを確認してください。

于 2015-05-31T18:26:30.757 に答える