1

これが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がメモリ制限の影響を受けないようにし、出力バッファリングがオフになっていることを確認した場合、大きなファイルがこの(新しい)問題を引き起こすのはなぜですか?

4

1 に答える 1

1

解決は簡単でした(数時間の作業の後)。

php_value output_buffering 0

Apache仮想ホスト構成に追加されました。

ob_get_level()が何を言ったかに関係なく、出力バッファリングが行われていたようです。つまり、出力バッファリングを使用するオプションだけで、PHPメモリの使用に影響を与えることができます。

于 2012-06-05T20:50:23.673 に答える