最近、エクスポート時に PHP のメモリ オーバーフローの問題が発生しました。その理由は、ダウンロード中に生成される一時ファイルが大きすぎて、PHP のメモリに収まらないためでした。最初は PHP のメモリ制限を変更しようと考えましたが、これは単なる問題でした。一時的な解決策なので、別の方法を考えました。それは、ファイルをバッチで読み込んでダウンロードすることです。
以下はソースコードです:
コードをコピーします コードは次のとおりです:
$sourceFile = "1.tmp" //一時ファイルの名前。ダウンロードされる
$outFile = "User Order.xls" //クライアントに保存されているファイル名をダウンロードします
$file_extension = strto lower(substr(strrchr($sourceFile, "."), 1));ファイル拡張子
//echo $sourceFile;
if (!ereg("[tmp|txt|rar|pdf|doc]", $file_extension))exit ("不正なリソースのダウンロード")
//ファイルが存在するかどうかを確認します
if (!is_file($sourceFile)) {
die("404 ファイルが見つかりません!");
}
$len = filesize($sourceFile); // ファイルサイズを取得します。
$filename =basename($sourceFile); // ファイル名を取得します
$outFile_extension = strto lower(substr(strrchr($outFile, "."), 1)) //ファイル拡張子を取得します
//出力を指定します拡張子に応じたブラウザ形式
switch ($outFile_extension) {
case "exe" :
$ctype = "application/octet-stream"
break;
case "zip" :
$ctype = "application/zip";
break;
case "mp3" :
$ctype = "オーディオ/mpeg";
case "mpg" :
$ctype; = "video/x-msvideo";
default :
$ctype = "application/force-download"
}
header("Cache-Control:"); Cache-Control: public");
//出力ブラウジングを設定する
header("Content-Type: $ctype");
header("Content-Disposition:attachment; filename=" . $outFile);
header("Accept -範囲: bytes");
$size = filesize ($sourceFile);
//$_SERVER['HTTP_RANGE'] パラメータがある場合
if (isset ($_SERVER['HTTP_RANGE'])) {
/*Rangeヘッダー フィールド Range ヘッダー フィールドは、エンティティ スコープの 1 つ以上のサブフィールドを要求できます。
たとえば、
は最初の 500 バイトを表します: bytes=0-499
2 番目の 500 バイトを表します: bytes=500-999
最後の 500 バイトを表します: bytes=-500
500 バイト以降の範囲を表します : bytes=500 -
最初と最後のバイト: bytes=0-0,-1
同時に複数の範囲を指定: bytes=500-600,601-999
ただし、無条件 GET に Range リクエスト ヘッダーが含まれている場合、サーバーはこのリクエスト ヘッダーを無視できます。応答はステータス コード 200 (OK) ではなく 206 (PartialContent) で返されます。
*/
// ブレークポイントの後に再度接続します。 $_SERVER['HTTP_RANGE'] の値は bytes=4390912-
list ($a, $range) =explode("=, $_SERVER['HTTP_RANGE']) です。 );
//はいの場合、不足している部分をダウンロードします
str_replace($range, "-", $range); //この文は何ですか? 。 。 。
$size2 = $size -1; //ファイル内の合計バイト数
$new_length = $size2 - $range; //次のダウンロードの長さを取得する
header("HTTP/1.1 206 Partial Content") ;
header( "Content-Length: $new_length") // 合計の長さを入力します
header("Content-Range: bytes $range$size2/$size"); //Content-Range: バイト 4908618-4988927/ 4988928 95% の確率で
} else {
//最初の接続
$size2 = $size -1;
header("Content-Range: bytes 0-$size2/$size"); 0-4988927/4988928
header("Content-Length: " . $size); //全体の長さを出力します
}
//ファイルを開きます
$fp = fopen("$sourceFile", "rb"); //ポインターの位置を設定します
fseek( $fp, $range);
//アンリアル出力
while (!feof($fp)) {
//ファイルの最大実行時間を設定します
set_time_limit(0); print (fread($fp, 1024 * 8) ); //出力ファイル
ob_flush();
;
http://www.bkjia.com/PHPjc/327461.html
www.bkjia.com
true
http://www.bkjia.com/PHPjc/327461.html
技術記事
最近、エクスポート時にPHPのメモリオーバーフローが発生する問題が発生しました。原因は、ダウンロード時に生成される一時ファイルが大きすぎて、PHPのメモリに収まらないためです。 始めたときに、PHPのメモリを変更しようと考えました...
。