関数の概要
PHPの fpassthru 関数は、ファイルポインタ(ストリームリソース)が指している現在の位置からファイルの終わりまでの内容を、そのまま出力バッファへ直接書き出します。主にファイルを読み込みながら即座にブラウザへ表示したいときや、ファイルの残り部分を効率的に出力したい場合に便利です。
パラメータの説明
resource $handle:読み込み対象のファイルハンドル。fopenなどでオープンされたファイルポインタを指定します。
戻り値
この関数は、出力したバイト数を整数で返します。処理に失敗した場合は false を返します。
使用例
基本的な使い方
<?php
$fp = fopen('example.txt', 'r');
if ($fp) {
fpassthru($fp);
fclose($fp);
}
?>
ファイル example.txt の内容を最初から最後までそのまま出力します。
部分的に読み込んだ後に残りを出力する例
<?php
$fp = fopen('example.txt', 'r');
if ($fp) {
// 最初の10バイトを読み込んで内容を取得
$head = fread($fp, 10);
echo '<p>先頭10バイト: ' . htmlspecialchars($head) . '</p>';
// 現在のカーソル位置から最後まで出力
fpassthru($fp);
fclose($fp);
}
?>
ファイルの最初の10バイトだけ文字列として取得し表示し、その後に残りの内容を直接出力します。
バイナリファイルの送信(ダウンロード処理)に使う例
<?php
$file = 'image.png';
if (file_exists($file)) {
header('Content-Type: image/png');
header('Content-Disposition: attachment; filename="' . basename($file) . '"');
$fp = fopen($file, 'rb');
if ($fp) {
fpassthru($fp);
fclose($fp);
}
exit;
}
?>
画像ファイルをブラウザにダウンロードさせる際に、ファイルの内容をそのまま出力する例です。大きなファイルも効率的に送信できます。
関連する関数
fread:ファイルの指定したバイト数を読み取るfgets:ファイルから1行を読み込むfile_get_contents:ファイル全体の内容を文字列として取得するreadfile:ファイル全体を読み込んで出力する(fpassthruと似ているが引数がパス)
まとめ
fpassthru は、ファイルポインタの現在位置から末尾までの内容を直接出力するシンプルで効率的な関数です。ファイルの一部を読み取った後に残りを出力したい場合や、ファイルの内容を即座にブラウザに送信したい場合に役立ちます。実務ではファイルのストリーム処理やダウンロード機能の実装に活用されることが多く、覚えておくと便利です。
