在 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; }
这些方法都可以避免一次性读取整个文件到内存中,从而提高处理大文件的性能。在实际应用中,可以根据需要选择合适的方法。