<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// 本文旨在解释 PHP 中 fpassthru 和 file_get_contents 两个函数的区别,并分析在实际应用中如何选择它们。</span></span><span>
</span><span><span class="hljs-comment">// ------------------------------------------------------------</span></span><span>
</span><span><span class="hljs-comment"># fpassthru 和 file_get_contents 有什么区别?什么时候应该优先选择 fpassthru 函数?</span></span><span>
在 PHP 中处理文件内容时,`</span><span><span class="hljs-title function_ invoke__">file_get_contents</span></span><span>()` 和 `</span><span><span class="hljs-title function_ invoke__">fpassthru</span></span><span>()` 是两个常用的函数,它们虽然都可用于读取文件,但使用场景和性能表现存在明显差异。了解它们的差异,对于编写高效、可靠的代码至关重要。
</span><span><span class="hljs-comment">## file_get_contents 简介</span></span><span>
`</span><span><span class="hljs-title function_ invoke__">file_get_contents</span></span><span>()` 是一个一次性读取整个文件内容的函数。它将文件内容作为字符串返回,适用于文件体积不大,且需要对内容进行进一步处理的场景。
**语法:**
```php
</span><span><span class="hljs-variable">$content</span></span><span> = </span><span><span class="hljs-title function_ invoke__">file_get_contents</span></span><span>(</span><span><span class="hljs-string">'example.txt'</span></span><span>);
</span></span>
シンプルで使いやすい。
コンテンツは変数に直接割り当てることができます。
ネットワークフローに使用できます(HTTPおよびFTPプロトコルをサポートします)。
欠点:
一度にメモリにファイルを読み取りますが、これは大きなファイルには適していません。
リソースフローの制御が少ない。
fpassthru()は、ファイルの最後まで開いたファイルポインターからデータの読み取りを開始し、標準出力に直接出力します。通常、ファイルの内容をブラウザに直接転送するために使用されます。特に、大きなファイルの効率的な転送に適しています。
文法:
<span><span><span class="hljs-variable">$fp</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fopen</span></span><span>(</span><span><span class="hljs-string">'example.txt'</span></span><span>, </span><span><span class="hljs-string">'rb'</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">fpassthru</span></span><span>(</span><span><span class="hljs-variable">$fp</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$fp</span></span><span>);
</span></span>
アドバンテージ:
大きなファイルやストリーミング出力(ビデオ、ダウンロードなど)に適しています。
それは多くの記憶を取り上げることはありません。
中間変数を避けるための直接出力。
欠点:
ファイルコンテンツを変数として直接取得することはできません。
使用する前にファイルハンドルを手動で開く必要があります。
特性 | file_get_contents | fpassthru |
---|---|---|
返品値 | 文字列(ファイルコンテンツ) | 出力ファイルコンテンツ、返品値なし |
メモリの使用 | ファイル全体がメモリにロードされます | ストリーミングリーディング、メモリの使用量が少ない |
処理に適したデータサイズ | 小さなファイル(構成、テンプレートなど) | 大きなファイル(ビデオ、コンテンツのダウンロードなど) |
使用法の複雑さ | 単純 | 少し複雑(ハンドルを開く必要があります) |
直接出力するかどうか | いいえ | はい |
FPASSTHRU()は、次のシナリオに推奨されます。
大きなファイル(ZIP、PDF、MP4など)をダウンロードしてください。
過度のメモリの使用を回避し、パフォーマンスを向上させることができます。
ストリーム内のクライアントにデータを転送します。
HTTPヘッダーを使用したダウンロードインターフェイスは、readfile()またはfpassthru()と組み合わせて実装できます。
中間処理なしの直接出力:
ファイルのみを転送する必要がある場合は、コンテンツ分析や変更は必要ありません。
例: FPASSTHRU()を使用して、ファイルのダウンロード機能を実装します
<span><span><span class="hljs-variable">$filename</span></span><span> = </span><span><span class="hljs-string">'large-file.zip'</span></span><span>;
</span><span><span class="hljs-title function_ invoke__">header</span></span><span>(</span><span><span class="hljs-string">'Content-Type: application/zip'</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">header</span></span><span>(</span><span><span class="hljs-string">'Content-Disposition: attachment; filename="'</span></span><span> . </span><span><span class="hljs-title function_ invoke__">basename</span></span><span>(</span><span><span class="hljs-variable">$filename</span></span><span>) . </span><span><span class="hljs-string">'"'</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">header</span></span><span>(</span><span><span class="hljs-string">'Content-Length: '</span></span><span> . </span><span><span class="hljs-title function_ invoke__">filesize</span></span><span>(</span><span><span class="hljs-variable">$filename</span></span><span>));
</span><span><span class="hljs-variable">$fp</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fopen</span></span><span>(</span><span><span class="hljs-variable">$filename</span></span><span>, </span><span><span class="hljs-string">'rb'</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">fpassthru</span></span><span>(</span><span><span class="hljs-variable">$fp</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$fp</span></span><span>);
</span><span><span class="hljs-keyword">exit</span></span><span>;
</span></span>
file_get_contents()またはfpassthru()の選択は、ファイルを処理する方法によって異なります。ファイルコンテンツを取得して論理処理を実行する必要がある場合は、 file_get_contents()を選択する方が便利です。処理せずにファイルをクライアントに効率的に転送する必要がある場合、 FPASSTHRU()がより適切な選択肢です。
それらの違いを理解することは、あなたのニーズに基づいて、より効率的で堅牢なPHPプログラムを書くのに役立ちます。
<span></span>
関連タグ:
file_get_contents