Menggunakan loop fgets()
panggilan adalah solusi yang bagus dan paling mudah untuk ditulis, namun:
meskipun secara internal file dibaca menggunakan buffer sebesar 8192 byte, kode Anda masih harus memanggil fungsi tersebut untuk setiap baris.
secara teknis mungkin satu baris mungkin lebih besar dari memori yang tersedia jika Anda membaca file biner.
Kode ini membaca file dalam potongan masing-masing 8kB dan kemudian menghitung jumlah baris baru dalam potongan itu.
function getLines($file)
{
$f = fopen($file, 'rb');
$lines = 0;
while (!feof($f)) {
$lines += substr_count(fread($f, 8192), "\n");
}
fclose($f);
return $lines;
}
Jika rata-rata panjang setiap baris paling banyak 4kB, Anda sudah mulai menghemat pemanggilan fungsi, dan itu dapat bertambah saat Anda memproses file besar.
Tolok ukur
Saya menjalankan tes dengan file 1GB; berikut hasilnya:
+-------------+------------------+---------+
| This answer | Dominic's answer | wc -l |
+------------+-------------+------------------+---------+
| Lines | 3550388 | 3550389 | 3550388 |
+------------+-------------+------------------+---------+
| Runtime | 1.055 | 4.297 | 0.587 |
+------------+-------------+------------------+---------+
Waktu diukur dalam detik waktu nyata, lihat sini apa arti sebenarnya
\n
) yang diurai pada mesin windows (PHP_EOL == '\r\n'
)