これは実は面白いです。
cURL
転送の進行状況を実際に追跡および制御できるようです。、およびに関するドキュメントを参照してください。CURLOPT_NOPROGRESS
CURLOPT_PROGRESSFUNCTION
CURLOPT_WRITEFUNCTION
この例を見つけて、次のように変更しました。
<?php
file_put_contents('progress.txt', '');
$target_file_name = 'targetfile.zip';
$target_file = fopen($target_file_name, 'w');
$ch = curl_init('http://localhost/so/testfile2.zip');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_NOPROGRESS, FALSE);
curl_setopt($ch, CURLOPT_PROGRESSFUNCTION, 'progress_callback');
curl_setopt($ch, CURLOPT_WRITEFUNCTION, 'write_callback');
curl_exec($ch);
if ($target_file) {
fclose($target_file);
}
$_download_size = 0;
function progress_callback($download_size, $downloaded_size, $upload_size, $uploaded_size) {
global $_download_size;
$_download_size = $download_size;
static $previous_progress = 0;
if ($download_size == 0) {
$progress = 0;
}
else {
$progress = round($downloaded_size * 100 / $download_size);
}
if ($progress > $previous_progress) {
$previous_progress = $progress;
$fp = fopen('progress.txt', 'a');
fputs($fp, $progress .'% ('. $downloaded_size .'/'. $download_size .")\n");
fclose($fp);
}
}
function write_callback($ch, $data) {
global $target_file_name;
global $target_file;
global $_download_size;
if ($_download_size > 1000000) {
return '';
}
return fwrite($target_file, $data);
}
write_callback
データのサイズが指定された制限より大きいかどうかを確認します。そうである場合は、転送を中止する空の文字列を返します。これを、それぞれ80Kと33Mの2つのファイルでテストしましたが、制限は1Mです。あなたの場合、progress_callback
2行目以降は無意味ですが、デバッグのためにすべてをそこに保持しました。
データのサイズを取得するもう1つの方法は、リクエストを実行することですが、サーバーがヘッダーHEAD
を送信する必要はないと思います。Content-length