fgets() 是读取文件第一行最轻量稳妥的方式,逐行读取且自动识别换行符;file_get_contents()+explode()会全量加载内存易OOM,且末尾无换行时可能取错;需注意BOM处理和二进制文件限制。

fgets() 是最轻量、最稳妥的方式,尤其适合大文件;别用 file_get_contents() + explode(),内存和性能都吃亏。
为什么不用 file_get_contents() 读完整文件再切第一行
因为这会把整个文件加载进内存——哪怕文件有几百 MB,你也只想要第一行。常见于日志分析、CSV 头解析等场景,一不留神就 OOM。另外,如果文件末尾没换行符,explode("\n", ...)[0] 可能取错(比如返回空或最后一行)。
fgets() 的正确打开方式
它逐行读取,遇到第一个 \n 或文件结束就停,天然适配“只取第一行”这个需求:
$fp = fopen('/path/to/file.txt', 'r');
if ($fp) {
$firstLine = fgets($fp);
fclose($fp);
// $firstLine 已含末尾 \n(如有),可用 rtrim($firstLine) 去掉
}
-
fgets()返回false表示文件为空或读取出错,记得判空 - 默认最多读 1024 字节,超长行会被截断;如需支持超长行,传第二个参数:
fgets($fp, 8192) - Windows 和 Linux 换行符(
\r\nvs\n)均能正确识别并停在第一行末
需要跳过 BOM 或判断编码怎么办
UTF-8 文件开头可能带 BOM(\xEF\xBB\xBF),导致 $firstLine 看似有乱码。可在 fgets() 后手动清除:
立即学习“PHP免费学习笔记(深入)”;
$firstLine = ltrim($firstLine, "\xEF\xBB\xBF");
更健壮的做法是先用 fopen() + fgets() 读出前几个字节检测 BOM,再 fseek($fp, 0) 回到开头重读——但绝大多数情况直接 ltrim 就够用。
真正要注意的是:如果文件是二进制格式(比如 PDF、Excel)、或者你不确定是否为纯文本,fgets() 会提前在第一个 \x00 或控制字符处截断——这种场景得换用 fread($fp, 1024) 配合正则找首行,但那就不是“读第一行”而是“解析文本结构”了。



















