fgets() 是最常用的读取一行数据的函数。其定义如下:
fgets(resource $handle, ?int $length = null): string|false
自动以换行符(\n)为结束标志。
包含换行符在返回的字符串中。
适合读取“标准行格式”的文本文件。
无法自定义行结束符。
$handle = fopen("https://gitbox.net/data.txt", "r");
while (($line = fgets($handle)) !== false) {
echo $line;
}
fclose($handle);
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头解析、自定义协议流 |
读取本地日志文件或配置文件。
快速读取按行组织的文本数据。
编写脚本处理标准输入或文件输入时。
读取 HTTP 或 SMTP 等网络协议中的分段数据。
控制行读取行为(不包含结尾符号)。
构建自己的解析器(如自定义协议、基于行结束符切割的流数据)。