PHP讀取大文件的類(lèi)SplFileObject使用介紹
如果加載的文件特別大時(shí),如幾百M(fèi),上G時(shí),這時(shí)性能就降下來(lái)了,那么PHP里有沒(méi)有對(duì)大文件的處理函數(shù)或者類(lèi)呢? 答案是:有的。
PHP真的越來(lái)越“面向?qū)ο蟆绷?,一些原有的基礎(chǔ)的SPL方法都開(kāi)始陸續(xù)地實(shí)現(xiàn)出class了。
從 PHP 5.1.0 開(kāi)始,SPL 庫(kù)增加了 SplFileObject 與 SplFileInfo 兩個(gè)標(biāo)準(zhǔn)的文件操作類(lèi)。SplFileInfo 是從 PHP 5.1.2 開(kāi)始實(shí)現(xiàn)的。
從字面意思理解看,可以看出 SplFileObject 要比 SplFileInfo 更為強(qiáng)大。
不錯(cuò),SplFileInfo 僅用于獲取文件的一些屬性信息,如文件大小、文件訪問(wèn)時(shí)間、文件修改時(shí)間、后綴名等值,而 SplFileObject 是繼承 SplFileInfo 這些功能的。
* @param string $filename 文件名
* @param int $startLine 開(kāi)始的行數(shù)
* @param int $endLine 結(jié)束的行數(shù)
* @return string
*/
function getFileLines($filename, $startLine = 1, $endLine=50, $method='rb') {
$content = array();
$count = $endLine - $startLine;
// 判斷php版本(因?yàn)橐玫絊plFileObject,PHP>=5.1.0)
if(version_compare(PHP_VERSION, '5.1.0', '>=')){
$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,''
}
Ps: 上面都沒(méi)加”讀取到末尾的判斷”:!$fp->eof() 或者 !feof($fp),加上這個(gè)判斷影響效率,自己加上測(cè)試很多很多很多行的運(yùn)行時(shí)間就曉得了,而且這里加上也完全沒(méi)必要。
從上面的函數(shù)就可以看出來(lái)使用SplFileObject比下面的fgets要快多了,特別是文件行數(shù)非常多、并且要取后面的內(nèi)容的時(shí)候。fgets要兩個(gè)循環(huán)才可以,并且要循環(huán)$endLine次。
此方法花了不少功夫,測(cè)試了很多中寫(xiě)法,就是想得出效率最高的方法。哪位覺(jué)得有值得改進(jìn)的歡迎賜教。
使用,返回35270行-35280行的內(nèi)容:
var_dump(getFileLines('test.php',35270,35280));
echo '</pre>';
- PHP使用fopen與file_get_contents讀取文件實(shí)例分享
- PHP file_get_contents函數(shù)讀取遠(yuǎn)程數(shù)據(jù)超時(shí)的解決方法
- php 使用file_get_contents讀取大文件的方法
- php讀取本地文件常用函數(shù)(fopen與file_get_contents)
- php fseek函數(shù)讀取大文件兩種方法
- PHP移動(dòng)文件指針ftell()、fseek()、rewind()函數(shù)總結(jié)
- php file_put_contents()功能函數(shù)(集成了fopen、fwrite、fclose)
- PHP $_FILES函數(shù)詳解
- PHP file_get_contents 函數(shù)超時(shí)的幾種解決方法
- php使用file函數(shù)、fseek函數(shù)讀取大文件效率對(duì)比分析
相關(guān)文章
php獲取qq用戶(hù)昵稱(chēng)和在線(xiàn)狀態(tài)(實(shí)例分析)
獲取qq在線(xiàn)狀態(tài)官方已有API提供了,我們用另一種方法獲取qq用戶(hù)昵稱(chēng)和在線(xiàn)狀態(tài),主要是為學(xué)習(xí)PHP。2013-10-10
yii框架數(shù)據(jù)庫(kù)關(guān)聯(lián)查詢(xún)操作示例
這篇文章主要介紹了yii框架數(shù)據(jù)庫(kù)關(guān)聯(lián)查詢(xún)操作,結(jié)合實(shí)例形式總結(jié)分析了yii數(shù)據(jù)庫(kù)關(guān)聯(lián)查詢(xún)的常見(jiàn)操作方法與使用注意事項(xiàng),需要的朋友可以參考下2019-10-10
Laravel框架基于ajax實(shí)現(xiàn)二級(jí)聯(lián)動(dòng)功能示例
這篇文章主要介紹了Laravel框架基于ajax實(shí)現(xiàn)二級(jí)聯(lián)動(dòng)功能,結(jié)合實(shí)例形式分析了Laravel框架ajax數(shù)據(jù)讀取及聯(lián)動(dòng)菜單的構(gòu)造與使用技巧,需要的朋友可以參考下2019-01-01
PHP中__autoload和Smarty沖突的簡(jiǎn)單解決方法
這篇文章主要介紹了PHP中__autoload和Smarty沖突的簡(jiǎn)單解決方法,通過(guò)spl_autoload_register注冊(cè)__autoload函數(shù)的方法來(lái)解決__autoload函數(shù)再在Smarty無(wú)效的問(wèn)題,需要的朋友可以參考下2016-04-04
ThinkPHP關(guān)于session的操作方法匯總
這篇文章主要介紹了ThinkPHP關(guān)于session的操作方法,有助于讀者加深對(duì)ThinkPHP操作session的認(rèn)識(shí),需要的朋友可以參考下2014-07-07
在CentOS系統(tǒng)上從零開(kāi)始搭建WordPress博客的全流程記錄
這篇文章主要介紹了在CentOS系統(tǒng)中從零開(kāi)始搭建WordPress站點(diǎn)的全流程記錄,使用最大眾的Apache服務(wù)器和MySQL數(shù)據(jù)庫(kù)環(huán)境,需要的朋友可以參考下2016-04-04

