如果加載的文件特別大時,如幾百M,上G時,這時性能就降下來了,那么PHP里有沒有對大文件的處理函數(shù)或者類呢? 答案是:有的。
PHP真的越來越“面向?qū)ο蟆绷耍恍┰械幕A(chǔ)的SPL方法都開始陸續(xù)地實現(xiàn)出class了。
從 PHP 5.1.0 開始,SPL 庫增加了 SplFileObject 與 SplFileInfo 兩個標(biāo)準(zhǔn)的文件操作類。SplFileInfo 是從 PHP 5.1.2 開始實現(xiàn)的。
從字面意思理解看,可以看出 SplFileObject 要比 SplFileInfo 更為強(qiáng)大。
不錯,SplFileInfo 僅用于獲取文件的一些屬性信息,如文件大小、文件訪問時間、文件修改時間、后綴名等值,而 SplFileObject 是繼承 SplFileInfo 這些功能的。
復(fù)制代碼 代碼如下:
/** 返回文件從X行到Y(jié)行的內(nèi)容(支持php5、php4)
* @param string $filename 文件名
* @param int $startLine 開始的行數(shù)
* @param int $endLine 結(jié)束的行數(shù)
* @return string
*/
function getFileLines($filename, $startLine = 1, $endLine=50, $method='rb') {
$content = array();
$count = $endLine - $startLine;
// 判斷php版本(因為要用到SplFileObject,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開始計數(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) {// 跳過前$startLine行
fgets($fp);
}
for($i;$i<=$endLine;++$i){
$content[]=fgets($fp);// 讀取文件行內(nèi)容
}
fclose($fp);
}
return array_filter($content); // array_filter過濾:false,null,''
}
復(fù)制代碼 代碼如下:
echo '<pre>';
var_dump(getFileLines('test.php',35270,35280));
echo '</pre>';
|
新聞熱點
疑難解答