PHP 讀取大檔案的X行到Y行內容的實現代碼

來源:互聯網
上載者:User

需要讀取一個檔案的幾行內容,但是檔案比較大,所以研究了下php讀取大檔案的幾行內容的方法,寫了一個方法,代碼如下(加了注釋):
快取檔案如果能夠儲存在一行, 而利用演算法讀取指定的行數, 自然會比全部讀出來挑選要快得多. 但php似乎這方面比較弱, 不太好操作. 就算使用SplFileObject仍然不是特別可取, 記憶體壓力存在.

複製代碼 代碼如下:$fp->seek($startLine - 1);

經過測試, 此行代碼在8MB文本中遊走到最後一行, 記憶體佔用為49KB, 還算不錯. 換成fopen方式用fgets跳過的模式, 則花費29KB的記憶體, fopen還是佔優勢.

複製代碼 代碼如下:function getFileLines($filename, $startLine = 1, $endLine = 50, $method = 'rb'){
$content = array();

if (version_compare(PHP_VERSION, '5.1.0', '>=')) { // 判斷php版本(因為要用到SplFileObject,PHP>=5.1.0)
$count = $endLine - $startLine;
$fp = new SplFileObject($filename, $method);
$fp->seek($startLine - 1); // 轉到第N行, seek方法參數從0開始計數
for ($i = 0; $i <= $count; ++$i) {
$content[] = $fp->current(); // current()擷取當前行內容
$fp->next(); // 下一行
}
} else { //PHP<5.1
$fp = fopen($filename, $method);
if (!$fp)
return 'error:can not read file';
for ($i = 1; $i < $startLine; ++$i) { // 跳過前$startLine行
fgets($fp);
}

for ($i; $i <= $endLine; ++$i) {
$content[] = fgets($fp); // 讀取檔案行內容
}
fclose($fp);
}
return array_filter($content); // array_filter過濾:false,null,''
}

效果不錯, SplFileObject類功能比較好.

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.