在 PHP 中,使用 file()
函数读取大文件可能会导致内存不足或程序执行时间过长。为了解决这个问题,可以采用以下技巧来逐行读取大文件:
fopen()
和 fgets()
函数:$filename = "large_file.txt";
$handle = fopen($filename, "r");
if ($handle) {
while (($line = fgets($handle)) !== false) {
// 处理每一行数据
processLine($line);
}
fclose($handle);
} else {
echo "无法打开文件: " . $filename;
}
file()
函数的 readfile()
或 fread()
函数:$filename = "large_file.txt";
if (file_exists($filename)) {
header("Content-Type: text/plain");
header("Content-Disposition: attachment; filename=\"" . basename($filename) . "\"");
header("Expires: 0");
header("Cache-Control: must-revalidate");
header("Pragma: public");
header("Content-Length: " . filesize($filename));
readfile($filename);
} else {
echo "文件不存在: " . $filename;
}
SplFileObject
类:$filename = "large_file.txt";
if (file_exists($filename)) {
$file = new SplFileObject($filename, 'r');
$file->seek(PHP_INT_MAX); // 将文件指针移动到文件末尾
while (!$file->eof()) {
// 处理每一行数据
processLine($file->fgets());
}
$file = null;
} else {
echo "文件不存在: " . $filename;
}
这些方法都可以避免一次性读取整个文件到内存中,从而提高处理大文件的性能。在实际应用中,可以根据需要选择合适的方法。