การใช้การfgets()
โทรแบบวนซ้ำเป็นวิธีแก้ปัญหาที่ดีและตรงไปตรงมาที่สุดในการเขียนอย่างไรก็ตาม:
แม้ว่าภายในไฟล์จะถูกอ่านโดยใช้บัฟเฟอร์ 8192 ไบต์ แต่โค้ดของคุณยังคงต้องเรียกใช้ฟังก์ชันนั้นสำหรับแต่ละบรรทัด
ในทางเทคนิคเป็นไปได้ว่าบรรทัดเดียวอาจใหญ่กว่าหน่วยความจำที่มีอยู่หากคุณกำลังอ่านไฟล์ไบนารี
รหัสนี้อ่านไฟล์เป็นชิ้นละ 8kB จากนั้นนับจำนวนขึ้นบรรทัดใหม่ภายในกลุ่มนั้น
function getLines($file)
{
$f = fopen($file, 'rb');
$lines = 0;
while (!feof($f)) {
$lines += substr_count(fread($f, 8192), "\n");
}
fclose($f);
return $lines;
}
หากความยาวเฉลี่ยของแต่ละบรรทัดไม่เกิน 4kB คุณจะเริ่มบันทึกการเรียกใช้ฟังก์ชันแล้วและสิ่งเหล่านี้สามารถรวมกันได้เมื่อคุณประมวลผลไฟล์ขนาดใหญ่
เกณฑ์มาตรฐาน
ฉันทำการทดสอบด้วยไฟล์ 1GB นี่คือผลลัพธ์:
+-------------+------------------+---------+
| This answer | Dominic's answer | wc -l |
+------------+-------------+------------------+---------+
| Lines | 3550388 | 3550389 | 3550388 |
+------------+-------------+------------------+---------+
| Runtime | 1.055 | 4.297 | 0.587 |
+------------+-------------+------------------+---------+
เวลาวัดเป็นวินาทีแบบเรียลไทม์ดูความหมายที่แท้จริงที่นี่
\n
) ถูกแยกวิเคราะห์บนเครื่อง windows (PHP_EOL == '\r\n'
)