1

ヘッダーを使用してサーバーにダウンロードしようとしているファイルがいくつかあります。ファイルを見つけますが、これらのファイルが 2 ~ 3 MB の場合、200 ~ 300 kbs しかダウンロードしません。私はこれに指を置くことができないようです。

これが私のコードです。

参考までに、ファイルの先頭に ob_start メソッドがあります。

$fileName = $row['fileURL'];
$fileURL = 'powerpoints/' . $fileName;
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=' . $fileName);
header("Content-Transfer-Encoding: binary");
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
ob_clean();
flush();
readfile($fileURL);
exit();

以下を編集..変更されたコード

$fileName = $row['fileURL'];
$fileURL = 'powerpoints/' . $fileName;
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=' . $fileName);
header("Content-Transfer-Encoding: binary");
header('Cache-Control: must-revalidate');
header('Content-Length: ' . filesize($row['size']));

$fdl = fopen($fileURL, "r"); 

if ($fdl === false) {
    die("Issue opening $fileURL");
}

while (!feof($fdl))
{
    $buffer = fread($fdl, 4096); 
    print $buffer;
}  

fclose($fdl); 
4

1 に答える 1

0

readfile は、一度にすべてをメモリに読み込もうとします。また、ファイルをチャンクで読み取って出力するだけで成功する可能性が高い場合、ここで出力バッファリングを使用する意味がわかりません。

したがって、出力バッファリングを取り除き、readfile の代わりに次のようなことを試みます。

sleep(1);
$fdl = fopen($fileURL, 'r');
if ($fdl === false) {
  die("Issue opening $fileURL");
}
while(!feof($fdl)) {
  $buffer = fread($fdl, 4096);
  print $buffer;
}
fclose($fdl);

Pragma: public追加のメモ、キャッシュ制御で再検証が必要な場合はなぜですか?

于 2013-01-29T14:36:53.190 に答える