1

ダウンロードスクリプトでpassthru( "cat filepath")を使用しています。私の懸念は、それが多くのサーバーリソースを使用する可能性があることです。

パブリックディレクトリ内のファイルを直接リンクすることと、phpでpassthru( "cat filepath")を使用してファイルをダウンロードすることの違いは何ですか?

4

3 に答える 3

4

パブリックディレクトリ内のファイルを直接リンクすることと、phpでpassthru( "cat filepath")を使用してファイルをダウンロードすることの違いは何ですか?

違いは、ファイルに直接リンクしてもPHPが呼び出されないのに対し、PHPスクリプトを実行するcatと、PHPとcatが呼び出されることです。これは適度な量の余分なメモリを消費しますが、ほとんどの状況でサーバーの負荷を引き起こすことはありません。

readfile()を使用していましたが、この関数は2GBを超えるファイルには使用できません。

その場合、すべてのファイルの内容をPHPに渡すよりも良い解決策を見つけたいと思うかもしれません。選択したWebサーバーソフトウェアでのX-Sendfileサポートを調べてください。

于 2011-06-24T07:15:03.330 に答える
3

そのために使用しないでくださいpassthru()、あなたはCLIインジェクションに自分自身を開いています、そしてパフォーマンスはひどいです。readfile()そのためだけに存在します。

readfile($filepath);

直接リンクと比較してPHPを通過するときのオーバーヘッドはわずかですが、通常はミリ秒について話します。ただし、ブラウザは、サポートをコーディングするか、のようなものを使用しない限り、206 Partialを使用するときにリクエストすることはできません。readfile()PEAR::HTTP_Download

編集:passthru()明らかにreadfile()2GBを超えるファイルを適切に処理しないため、使用しているようです(readfile()実際、7.2 GBのファイルでテストしただけで、問題なく動作しました)。その場合、少なくともパラメータをエスケープしてください。

function readfile_ext($filepath) {
  if(!file_exists($filepath))
    return false;

   passthru('cat ' . escapeshellarg($filepath));
   return true;
}
于 2011-06-24T07:08:39.307 に答える
2

の代わりに、パフォーマンスが優れているpassthru('cat filepath')PHPネイティブを使用してください。readfile('filepath')

ただし、PHPには一定のオーバーヘッドがあるため、どちらの方法もファイルに直接リンクするよりも遅くなります。

于 2011-06-24T07:09:34.537 に答える