現在の位置: ホーム> 最新記事一覧> PHPでFPASSTHRU関数を使用してファイルストリーミングを実装する完全な方法は何ですか?

PHPでFPASSTHRU関数を使用してファイルストリーミングを実装する完全な方法は何ですか?

gitbox 2025-05-28

PHPでは、 FPASSTHRU関数は非常に実用的なファイルストリーミングツールであり、特に写真、ビデオ、ダウンロードなどのクライアントにファイルコンテンツを直接出力するのに適しています。最大の利点は、ファイル全体をメモリに読み取ることなくファイルコンテンツを効率的に転送し、リソースを節約し、メモリオーバーフローの問題を11回にすることです。

この記事では、 FPASSTHRU関数を使用してファイルストリーミングを実装する方法を詳細に紹介し、完全なサンプルコードを組み合わせてすぐに開始できるようにします。


fpassthruとは何ですか?

FPASSTHRUはPHPファイル操作の関数であり、機能はファイルの最後まで現在のファイルポインター位置から出力することです。 Fopenと組み合わせてよく使用されます。ファイルを開いた後、ファイルの内容はブラウザに直接出力されます。

関数プロトタイプ:

 int fpassthru ( resource $handle )
  • $ハンドルは、fopen()によって返されるファイルポインターリソースです。

  • 返品値は、バイト出力数です。


シナリオを使用します

  • ファイルダウンロードインターフェイス

  • 画像またはビデオストリームの出力

  • ファイルをクライアントに無傷で送信する必要があるシナリオ


FPASSTHRUを使用してファイルストリーミングを実装する手順

  1. ファイルを開きます<br> FOPEN()を使用して、ファイルをバイナリモードで開き、転送されたファイルが文字エンコードの影響を受けないようにします。

  2. 正しいHTTPヘッダーを送信します<br> ファイルの種類(ダウンロードされたファイルの場合)に従って、対応するコンテンツタイプコンテンツレングスコンテンツ拡散を送信します。

  3. fpassthruを呼び出してファイルストリームを出力します<br> ファイルコンテンツをクライアントに直接エクスポートします。

  4. ファイルリソースを閉じる<br> リソースの漏れを避けるためにリソースをリリースします。


完全なサンプルコード

<?php
// ファイルパス
$filePath = '/path/to/your/file.zip';

// ファイルが存在するかどうかを判断します
if (!file_exists($filePath)) {
    header("HTTP/1.1 404 Not Found");
    exit("File not found.");
}

// ファイルを開きます
$fp = fopen($filePath, 'rb');
if (!$fp) {
    header("HTTP/1.1 500 Internal Server Error");
    exit("Failed to open file.");
}

// ファイルサイズを取得します
$fileSize = filesize($filePath);

// 設定 HTTP 頭,ブラウザファイルの種類とサイズを伝えます
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="' . basename($filePath) . '"');
header('Content-Length: ' . $fileSize);
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Expires: 0');

// 使用 fpassthru 出力ファイルコンテンツ
fpassthru($fp);

// ファイルリソースを閉じます
fclose($fp);
exit;
?>

コードの説明

  • fopen($ filepath、 'rb') :バイナリ読み取り専用モードでファイルを開きます。

  • HTTPヘッダーセットは、ブラウザがファイルの種類とサイズを認識し、コンテンツ拡散がダウンロードされたファイルのデフォルト名を指定することを保証します。

  • fpassthru($ fp)は、ファイルの現在の位置からファイルの最後まで直接すべてのデータを出力します。

  • ファイルのハンドルを閉じて終了して、冗長コンテンツが出力されないようにします。


注意すべきこと

  • ファイルが大きい場合、 FasSthruはすべてのファイルをメモリに読み取らないため、それを転送する効率的な方法です。

  • 転送する前に適切なHTTPヘッダーを送信して、ブラウザがファイルを正しく処理することを確認してください。

  • ファイルパスがユーザー入力から来る場合は、パス交差などのセキュリティリスクを防ぐために、セキュリティ確認を実行してください。

  • ブレークポイントの連続伝送をサポートするダウンロード要件には、追加のhttp_rangeヘッダーが必要であり、この記事では詳細に説明しません。


まとめ

上記の手順を通じて、PHPのFPASSTHRU関数を簡単に使用して、効率的なファイルストリーミングを実現できます。簡潔なコードと優れたパフォーマンスを備えた、あらゆる種類のファイルのダウンロードおよびストリーミングメディア出力シナリオに適しています。

ファイルのダウンロードインターフェイスまたはメディアストリーミングサービスを作成する必要がある場合は、 FPASSTHRUを試してみることもできます。これにより、コードがより簡潔で効率的になります。