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
) एक विंडोज़ मशीन पर पार्स की जा सकती है (PHP_EOL == '\r\n'
)