fgets() 函数是PHP中用于从打开的文件中读取一行的内置函数。它通常用于逐行读取文件内容,是文件处理中的常用函数。
语法
string fgets ( resource $handle [, int $length ] )
参数说明
| 参数 | 描述 | 是否必需 | 默认值 |
|---|---|---|---|
| handle | 文件指针,必须是有效的,由 fopen() 函数创建 |
是 | - |
| length | 可选。指定要读取的字节数。读取会在达到 length-1 字节、换行符或 EOF 时停止 | 否 | 1024 字节 |
返回值
- 成功时返回读取的字符串(包含行结束符)。
- 如果读取失败或到达文件末尾 (EOF),则返回 FALSE。
注意事项
- 文件指针必须通过
fopen()成功打开。 - 读取的行包括行结束符(如 \n 或 \r\n)。
- 如果未指定 length 参数,默认读取直到行结束或 1024 字节。
- 使用
feof()检查是否到达文件末尾。
示例代码
示例1:基本使用 - 逐行读取文件
<?php
// 打开文件
$file = fopen("test.txt", "r") or die("无法打开文件!");
// 逐行读取直到文件结束
while(!feof($file)) {
echo fgets($file) . "<br>";
}
// 关闭文件
fclose($file);
?>
示例2:指定读取长度
<?php
$file = fopen("test.txt", "r");
// 每次最多读取50个字节
if ($file) {
while (($line = fgets($file, 50)) !== false) {
echo $line . "<br>";
}
fclose($file);
}
?>
示例3:处理大文件 - 内存高效的方式
<?php
function readLargeFile($filename) {
$file = fopen($filename, "r");
if ($file) {
while (($line = fgets($file)) !== false) {
// 处理每一行
echo htmlspecialchars($line) . "<br>";
}
fclose($file);
} else {
echo "无法打开文件: $filename";
}
}
readLargeFile("large_data.txt");
?>
示例4:使用 fgets() 与 fgetcsv() 对比
<?php
// fgets() 读取整行
$file1 = fopen("data.txt", "r");
echo "使用 fgets() 读取:<br>";
while ($line = fgets($file1)) {
echo "行内容: " . $line . "<br>";
}
fclose($file1);
echo "<hr>";
// fgetcsv() 读取CSV行
$file2 = fopen("data.csv", "r");
echo "使用 fgetcsv() 读取CSV:<br>";
while ($data = fgetcsv($file2)) {
echo "字段: " . implode(", ", $data) . "<br>";
}
fclose($file2);
?>
常见错误处理
<?php
$filename = "data.txt";
// 检查文件是否存在
if (!file_exists($filename)) {
die("文件 $filename 不存在");
}
// 尝试打开文件
$file = @fopen($filename, "r");
if (!$file) {
die("无法打开文件 $filename");
}
// 安全读取
while (($line = fgets($file)) !== false) {
echo $line;
}
// 检查是否因错误而停止
if (!feof($file)) {
echo "错误: 读取意外终止";
}
fclose($file);
?>
与类似函数的比较
| 函数 | 描述 | 区别 |
|---|---|---|
fgets() |
读取一行,包含行结束符 | 保留行结束符 |
fgetss() |
读取一行并剥离 HTML/PHP 标签 | 已废弃,PHP 7.3+ 移除 |
fgetcsv() |
从 CSV 文件读取一行并解析为数组 | 专用于 CSV 格式 |
file() |
将整个文件读入数组 | 一次性读取,内存消耗大 |
重要提示
从 PHP 8.0.0 开始,fgets() 在失败时抛出 ValueError 异常,而之前返回 FALSE。建议使用 try-catch 进行错误处理。