在 PHP 中,使用 file()
函數(shù)讀取大文件可能會(huì)導(dǎo)致內(nèi)存不足或程序執(zhí)行時(shí)間過長。為了解決這個(gè)問題,可以采用以下技巧來逐行讀取大文件:
fopen()
和 fgets()
函數(shù):$filename = "large_file.txt";
$handle = fopen($filename, "r");
if ($handle) {
while (($line = fgets($handle)) !== false) {
// 處理每一行數(shù)據(jù)
processLine($line);
}
fclose($handle);
} else {
echo "無法打開文件: " . $filename;
}
file()
函數(shù)的 readfile()
或 fread()
函數(shù):$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); // 將文件指針移動(dòng)到文件末尾
while (!$file->eof()) {
// 處理每一行數(shù)據(jù)
processLine($file->fgets());
}
$file = null;
} else {
echo "文件不存在: " . $filename;
}
這些方法都可以避免一次性讀取整個(gè)文件到內(nèi)存中,從而提高處理大文件的性能。在實(shí)際應(yīng)用中,可以根據(jù)需要選擇合適的方法。