ダウンロードスクリプトでpassthru( "cat filepath")を使用しています。私の懸念は、それが多くのサーバーリソースを使用する可能性があることです。
パブリックディレクトリ内のファイルを直接リンクすることと、phpでpassthru( "cat filepath")を使用してファイルをダウンロードすることの違いは何ですか?
ダウンロードスクリプトでpassthru( "cat filepath")を使用しています。私の懸念は、それが多くのサーバーリソースを使用する可能性があることです。
パブリックディレクトリ内のファイルを直接リンクすることと、phpでpassthru( "cat filepath")を使用してファイルをダウンロードすることの違いは何ですか?
パブリックディレクトリ内のファイルを直接リンクすることと、phpでpassthru( "cat filepath")を使用してファイルをダウンロードすることの違いは何ですか?
違いは、ファイルに直接リンクしてもPHPが呼び出されないのに対し、PHPスクリプトを実行するcat
と、PHPとcat
が呼び出されることです。これは適度な量の余分なメモリを消費しますが、ほとんどの状況でサーバーの負荷を引き起こすことはありません。
readfile()を使用していましたが、この関数は2GBを超えるファイルには使用できません。
その場合、すべてのファイルの内容をPHPに渡すよりも良い解決策を見つけたいと思うかもしれません。選択したWebサーバーソフトウェアでのX-Sendfileサポートを調べてください。
そのために使用しないでください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;
}
の代わりに、パフォーマンスが優れているpassthru('cat filepath')
PHPネイティブを使用してください。readfile('filepath')
ただし、PHPには一定のオーバーヘッドがあるため、どちらの方法もファイルに直接リンクするよりも遅くなります。