当前位置: 首页> 最新文章列表> 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 等网络协议中的分段数据。

  • 控制行读取行为(不包含结尾符号)。

  • 构建自己的解析器(如自定义协议、基于行结束符切割的流数据)。