欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

PHP 讀取大文件的X行到Y(jié)行內(nèi)容的實(shí)現(xiàn)代碼

 更新時(shí)間:2013年06月24日 23:25:49   作者:  
需要讀取一個(gè)文件的幾行內(nèi)容,但是文件比較大,所以研究了下php讀取大文件的幾行內(nèi)容的方法,寫了一個(gè)方法,代碼如下
需要讀取一個(gè)文件的幾行內(nèi)容,但是文件比較大,所以研究了下php讀取大文件的幾行內(nèi)容的方法,寫了一個(gè)方法,代碼如下(加了注釋):
緩存文件如果能夠保存在一行, 而利用算法讀取指定的行數(shù), 自然會(huì)比全部讀出來(lái)挑選要快得多. 但php似乎這方面比較弱, 不太好操作. 就算使用SplFileObject仍然不是特別可取, 內(nèi)存壓力存在.

復(fù)制代碼 代碼如下:

$fp->seek($startLine - 1);


經(jīng)過(guò)測(cè)試, 此行代碼在8MB文本中游走到最后一行, 內(nèi)存占用為49KB, 還算不錯(cuò). 換成fopen方式用fgets跳過(guò)的模式, 則花費(fèi)29KB的內(nèi)存, fopen還是占優(yōu)勢(shì).

復(fù)制代碼 代碼如下:

function getFileLines($filename, $startLine = 1, $endLine = 50, $method = 'rb'){
$content = array();

if (version_compare(PHP_VERSION, '5.1.0', '>=')) { // 判斷php版本(因?yàn)橐玫絊plFileObject,PHP>=5.1.0)
$count = $endLine - $startLine;
$fp = new SplFileObject($filename, $method);
$fp->seek($startLine - 1); // 轉(zhuǎn)到第N行, seek方法參數(shù)從0開(kāi)始計(jì)數(shù)
for ($i = 0; $i <= $count; ++$i) {
$content[] = $fp->current(); // current()獲取當(dāng)前行內(nèi)容
$fp->next(); // 下一行
}
} else { //PHP<5.1
$fp = fopen($filename, $method);
if (!$fp)
return 'error:can not read file';
for ($i = 1; $i < $startLine; ++$i) { // 跳過(guò)前$startLine行
fgets($fp);
}

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


效果不錯(cuò), SplFileObject類功能比較好.

相關(guān)文章

最新評(píng)論