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)存壓力存在.
$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ì).
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開始計(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類功能比較好.
緩存文件如果能夠保存在一行, 而利用算法讀取指定的行數(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開始計(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)文章
PHP實(shí)現(xiàn)按之字形順序打印二叉樹的方法
這篇文章主要介紹了PHP實(shí)現(xiàn)按之字形順序打印二叉樹的方法,涉及php結(jié)合棧遍歷二叉樹的相關(guān)操作技巧,需要的朋友可以參考下2018-01-01
php文件包含目錄配置open_basedir的使用與性能詳解
下面小編就為大家?guī)?lái)一篇php文件包含目錄配置open_basedir的使用與性能詳解。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-04-04
IP攻擊升級(jí),程序改進(jìn)以對(duì)付新的攻擊
我上一篇文章《最新開發(fā)的網(wǎng)站防IP攻擊代碼,超級(jí)有用》寫了一個(gè)完整的防止網(wǎng)絡(luò)惡意IP攻擊的方案,使用了一個(gè)月,效果良好。2010-11-11
使用array mutisort 實(shí)現(xiàn)按某字段對(duì)數(shù)據(jù)排序
本篇文章是對(duì)使用array mutisort 實(shí)現(xiàn)按某字段對(duì)數(shù)據(jù)排序的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06
php驗(yàn)證郵箱和ip地址最簡(jiǎn)單方法匯總
這篇文章為大家分享了php驗(yàn)證郵箱和ip地址最簡(jiǎn)單的方法,,需要的朋友可以參考下2015-10-10
php鏈?zhǔn)讲僮鞯膶?shí)現(xiàn)方式分析
這篇文章主要介紹了php鏈?zhǔn)讲僮鞯膶?shí)現(xiàn)方式,結(jié)合實(shí)例形式對(duì)比分析了常規(guī)調(diào)用與鏈?zhǔn)秸{(diào)用操作的相關(guān)實(shí)現(xiàn)技巧與操作注意事項(xiàng),需要的朋友可以參考下2019-08-08

