當前位置: 首頁> 最新文章列表> stream_get_line 與fgets 的區別與使用場景對比

stream_get_line 與fgets 的區別與使用場景對比

gitbox 2025-05-29

fgets()的工作方式

fgets()是最常用的讀取一行數據的函數。其定義如下:

 fgets(resource $handle, ?int $length = null): string|false
  • $handle是已經打開的文件指針(如使用fopen()得到的)。

  • $length是可選的最大讀取長度(包括換行符)。如果不指定, fgets()會一直讀取到行結束( \n )或文件結束為止。

特點:

  • 自動以換行符( \n )為結束標誌。

  • 包含換行符在返回的字符串中。

  • 適合讀取“標準行格式”的文本文件。

  • 無法自定義行結束符。

示例:

 $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
  • $length是最多讀取的字節數。

  • $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()
是否包含換行符
可否自定義行結束符
性能一般較優(尤其在網絡流中)
靈活性
應用場景本地文本文件讀取網絡流、HTTP頭解析、自定義協議流

各自適合的使用場景

fgets()適合:

  • 讀取本地日誌文件或配置文件。

  • 快速讀取按行組織的文本數據。

  • 編寫腳本處理標準輸入或文件輸入時。

stream_get_line()適合:

  • 讀取HTTP 或SMTP 等網絡協議中的分段數據。

  • 控制行讀取行為(不包含結尾符號)。

  • 構建自己的解析器(如自定義協議、基於行結束符切割的流數據)。