これがPHPの問題なのか、サーバー構成の問題なのか、ハードウェアの問題なのかはわかりませんが、PHPから始めて、何か提案があるかどうかを確認したいと思いました。このコードは最近まで正常に機能していましたが、これを引き起こした可能性のある構成の変更を認識していません。最近、Debian LennyからSqueezeに(そしてPHP 5.2から5.3に)アップグレードしましたが、コードは別のSqueezeサーバーで正常に動作します。
GET変数として渡されたファイルへのパスを取得するPHPコードが少しあります(mod_rewriteを介してhttp://site.com/request/for/file.pdfからhttp://site.comへのリクエストから書き換えられます) /downloader.php?path=/path/to/file.pdf)。これを行う理由は、統計の追跡に関連しています。
ファイルはこのビットコードに渡されます(読みやすくするために簡略化されています)。
if(is_readable($theFile)) {
//$fh= fopen($theFile, "r");
header("Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0");
header("Pragma: no-cache");
header("Content-Type: application/pdf");
header("Content-Disposition: attachment; filename=\"".basename($theFile)."\"");
header("Content-Length:".(string)(filesize($theFile)));
sleep(1);
//fpassthru($fh);
readfile($theFile);
}
ご覧のとおり、コードはファイルが読み取り可能である場合(つまり、パスがすべて正しい場合)にのみ実行されます。約63MB未満のファイルの場合、すべてが正常に機能します。63MBを超える場合、サーバーは500エラーを返します。(これはFirefox / Chromeで「ファイルが見つかりません」として報告されますが、「内部サーバーエラー」であるはずですが、それは別の話だと思います)。Apacheエラーログには何もありません。
これを引き起こすPHPまたはApacheサーバーの構成を誰かが考えることができますか?私の知る限り、PHPのメモリ制限はreadfileやfpassthruの影響を受けないはずです。PHPのメモリ制限は64MBですが、PHPへのmod_rewriteリダイレクトをオフにしても問題は解決しません。それでもファイルはダウンロードされません。
提案をありがとう。
更新**** * ** * ** * _
では、PHPのメモリ制限を64MBから200MBに増やしました。これにより、最大200MBのファイルをダウンロードできます。ただし、問題は残ります。readfileとfpassthruがメモリ制限の影響を受けないようにし、出力バッファリングがオフになっていることを確認した場合、大きなファイルがこの(新しい)問題を引き起こすのはなぜですか?