日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

php读程序,PHP 读取大文件程序代码

發布時間:2024/10/14 php 128 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php读程序,PHP 读取大文件程序代码 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

PHP 讀取大文件與讀取一般的文件是有些區別的,如果你的文件到了幾百MB或GB這樣可能普通的php讀取文件會很慢或卡死了,下面我來介紹一下PHP 讀取大文件技巧吧。

一般讀取文件我們用fopen 或者 file_get_contents ,前者可以循環讀取,后者可以一次性讀取,但都是將文件內容一次性加載來操作。如果加載的文件特別大時,如幾百M,上G時,這時性能就降下來了,那么PHP里有沒有對大文件的處理函數或者類呢? 答案是:有的。

PHP真的越來越“面向對象”了,一些原有的基礎的SPL方法都開始陸續地實現出class了。

從 PHP 5.1.0 開始,SPL 庫增加了 SplFileObject 與 SplFileInfo 兩個標準的文件操作類。SplFileInfo 是從 PHP 5.1.2 開始實現的。

從字面意思理解看,可以看出 SplFileObject 要比 SplFileInfo 更為強大。

不錯,SplFileInfo 僅用于獲取文件的一些屬性信息,如文件大小、文件訪問時間、文件修改時間、后綴名等值,而 SplFileObject 是繼承 SplFileInfo 這些功能的。

代碼如下

復制代碼

/** 返回文件從X行到Y行的內容(支持php5、php4)

* @param string $filename 文件名

* @param int $startLine 開始的行數

* @param int $endLine 結束的行數

* @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);// 轉到第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

fgets($fp);

}

for($i;$i<=$endLine;++$i){

$content[]=fgets($fp);// 讀取文件行內容

}

fclose($fp);

}

return array_filter($content); // array_filter過濾:false,null,''

}

Ps: 上面都沒加”讀取到末尾的判斷”:!$fp->eof() 或者 !feof($fp),加上這個判斷影響效率,自己加上測試很多很多很多行的運行時間就曉得了,而且這里加上也完全沒必要。

從上面的函數就可以看出來使用SplFileObject比下面的fgets要快多了,特別是文件行數非常多、并且要取后面的內容的時候。fgets要兩個循環才可以,并且要循環$endLine次。

此方法花了不少功夫,測試了很多中寫法,就是想得出效率最高的方法。哪位覺得有值得改進的歡迎賜教。

使用,返回35270行-35280行的內容:

代碼如下

復制代碼

echo '';

var_dump(getFileLines('test.php',35270,35280));

echo '';

再看一個實例

代碼如下

復制代碼

function readBigFile($filename, $count = 20, $tag = "rn") {

$content = "";//最終內容

$current = "";//當前讀取內容寄存

$step= 1;//每次走多少字符

$tagLen = strlen($tag);

$start = 0;//起始位置

$i = 0;//計數器

$handle = fopen($filename,'r+');//讀寫模式打開文件,指針指向文件起始位置

while($i < $count && !feof($handle)) {

fseek($handle, $start, SEEK_SET);//指針設置在文件開頭

$current = fread($handle,$step);//讀取文件

$content .= $current;//組合字符串

$start += $step;//依據步長向前移動

//依據分隔符的長度截取字符串最后免得幾個字符

$substrTag = substr($content, -$tagLen);

if ($substrTag == $tag) { //判斷是否為判斷是否是換行或其他分隔符

$i++;

$content .= "

";

}

}

//關閉文件

fclose($handle);

//返回結果

return $content;

}

$filename = "csdn.sql";//需要讀取的文件

$tag = "n";//行分隔符 注意這里必須用雙引號

$count = 100;//讀取行數

$data = readBigFile($filename,$count,$tag);

echo $data;

注意:通過使用PHP的fseek和fread相結合,即可做到隨意讀取文件中的某一部份數據,關于函數傳入的變量$tag的值,根據系統不一樣,傳入的值也是有區別的:Windows用”rn”,linux/unix用”n”,Mac OS用”r”。

總結

以上是生活随笔為你收集整理的php读程序,PHP 读取大文件程序代码的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。