現在の位置: ホーム> 最新記事一覧> stream_get_lineとfgetsの違いと使用法のシナリオの比較

stream_get_lineとfgetsの違いと使用法のシナリオの比較

gitbox 2025-05-29

fgets()の仕組み

fgets()は、データの行を読み取るために最も一般的に使用される関数です。その定義は次のとおりです。

 fgets(resource $handle, ?int $length = null): string|false
  • $ハンドルはfopen()で取得されたオープンファイルポインターです。

  • $の長さは、オプションの最大読み取り長(ラインブレークを含む)です。指定されていない場合、 fgets()は、行の最後( \ n )またはファイルの終了まで読み取られます。

特徴:

  • NewLine文字( \ n )で自動的に終了します。

  • 返された文字列にnewlinesが含まれています。

  • 「標準ライン形式」の読み取りに適しています。

  • Line Ending文字をカスタマイズできません。

例:

 $handle = fopen("https://gitbox.net/data.txt", "r");
while (($line = fgets($handle)) !== false) {
    echo $line;
}
fclose($handle);

Stream_get_line()の動作方法

stream_get_line()は、より基本的で柔軟な読み取り機能であり、次のように定義されています。

 stream_get_line(resource $handle, int $length, string $ending = ""): string|false
  • $の長さは、読み取る最大バイト数です。

  • $ ENDINGは、カスタムラインエンディング文字(オプション)です。

特徴:

  • エンディングキャラクター自体は返されません。

  • カスタムラインエンディング文字(HTTPヘッダーで一般的に使用される「\ r \ n」など)を許可します。

  • ラインブレークを含むバイナリデータブロックの読み取りには適していません。

  • リターンコンテンツには行の終了文字が含まれていないため、データ構造が正確に制御されるシナリオにより適しています。

例:

 $handle = fopen("https://gitbox.net/api/stream", "r");
while (($line = stream_get_line($handle, 1024, "\r\n")) !== false) {
    echo $line . PHP_EOL;
}
fclose($handle);

違いの概要

特性fgets() stream_get_line()
ラインブレークを含めるかどうかはいいいえ
Line Ending文字をカスタマイズできますか?いいえはい
パフォーマンス一般的により良い(特にネットワークフローで)
柔軟性低い高い
アプリケーションシナリオローカルテキストファイルの読み取りネットワークフロー、HTTPヘッダー解析、カスタムプロトコルフロー

各適切な使用シナリオ

fgets()は以下に適しています

  • ローカルログファイルまたは構成ファイルを読み取ります。

  • 行ごとに整理されたテキストデータをすばやく読み取ります。

  • 標準入力またはファイル入力を処理するためのスクリプトを作成するとき。

stream_get_line()は次のように適しています。

  • HTTPやSMTPなどのネットワークプロトコルでセグメント化されたデータを読み取ります。

  • row readの動作を制御します(エンディングシンボルを除く)。

  • 独自のパーサー(カスタムプロトコル、ラインエンディング文字に基づいてデータをストリーミングするなど)を構築します。