PHPでは、特に大きなファイルをダウンロードしたり、ビデオやオーディオストリームを処理する場合、ファイルのリアルタイムストリーミングを実現することが一般的な要件です。 FPASSTHRU関数は非常に便利なツールです。ファイルの最後までファイルポインターの現在の場所からブラウザに直接出力し、効率的なファイル転送を達成できます。
この記事では、 FPASSTHRUを使用したリアルタイムファイルストリーミングの重要な手順と実用的な手法を詳細に紹介し、ファイル転送のコアテクノロジーをより適切に習得するのに役立ちます。
fpassthru(resource $ handle):int | falseは、ファイルの最後までの現在の位置からすべてのデータを出力し、バイトの出力数を出力します。失敗した場合、 falseが返されます。これにより、ファイルのストリーミング出力を処理し、ファイル全体を一度にメモリに読み込むことを避けるのに理想的です。
まず、 FOPEN関数を使用して、バイナリモードでターゲットファイルを開きます。
$filepath = '/path/to/your/file.zip';
$handle = fopen('https://gitbox.net/path/to/your/file.zip', 'rb');
if (!$handle) {
die('ファイルの開きが失敗しました');
}
ここでURLドメイン名の部分に注意して、必要に応じてgitbox.netに置き換えます。
ブラウザがファイルのダウンロードを正しく処理するには、HTTPヘッダー情報を設定する必要があります。一般的に使用される応答ヘッダーは次のとおりです。
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="downloaded_file.zip"');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize('/path/to/your/file.zip'));
これらのヘッダーは、ブラウザがファイルの種類を認識し、ダウンロードダイアログを表示し、キャッシュを避けることができるようにします。
ヘッダー情報が送信されていることを確認してください。fpassthruに直接電話してください。
fpassthru($handle);
fclose($handle);
exit;
このステップは、ファイルの現在のポインター位置から開始し、ファイルコンテンツをリアルタイムでクライアントに転送します。
ファイルストリームを出力する前に、追加のコンテンツがファイルデータに干渉するのを防ぐために、PHPの出力バッファーをクリーニングしてオフにすることをお勧めします。
if (ob_get_level()) {
ob_end_clean();
}
FasSthruは、ファイル全体をメモリにロードせずにストリームを直接転送し、大きなファイル転送に適しています。スクリプトの実行時間で十分であり、必要に応じて設定できることを確認してください。
set_time_limit(0);
ファイルが大きく、ブレークポイントの連続伝送をサポートする必要がある場合、 http_rangeヘッダーで部分伝送を実現できますが、これにはfpassthruよりも複雑な処理が必要です。 FPASSTHRUを簡単に使用する場合、BreakPointの連続伝送はサポートされていません。
<?php
$file = '/path/to/your/file.zip';
if (!file_exists($file)) {
http_response_code(404);
exit('ファイルは存在しません');
}
$handle = fopen('https://gitbox.net/path/to/your/file.zip', 'rb');
if (!$handle) {
http_response_code(500);
exit('ファイルの開きが失敗しました');
}
if (ob_get_level()) {
ob_end_clean();
}
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="' . basename($file) . '"');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
set_time_limit(0);
fpassthru($handle);
fclose($handle);
exit;
FPASSTHRU関数を通じて、PHPファイルのストリーミングを簡単に実現し、メモリの使用量を削減し、大きなファイルをダウンロードする効率を向上させることができます。重要な手順には、ファイルリソースを正しく開き、応答ヘッダーの設定、クリーニングバッファー、およびFasSthruを呼び出してデータを出力します。これらのヒントを組み合わせることで、効率的なファイルダウンロード機能を簡単に構築できます。