亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > PHP > 正文

PHP 讀取大文件程序代碼

2024-05-04 21:47:59
字體:
來源:轉載
供稿:網友

一般讀取文件我們用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 這些功能的.

代碼如下:

  1.  /** 返回文件從X行到Y行的內容(支持php5、php4)   
  2.  * @param string $filename 文件名 
  3.  * @param int $startLine 開始的行數 
  4.  * @param int $endLine 結束的行數 
  5.  * @return string 
  6.  */ 
  7. function getFileLines($filename$startLine = 1, $endLine=50, $method='rb') { 
  8.     $content = array(); 
  9.     $count = $endLine - $startLine;   
  10.     // 判斷php版本(因為要用到SplFileObject,PHP>=5.1.0) 
  11.     if(version_compare(PHP_VERSION, '5.1.0''>=')){ 
  12.         $fp = new SplFileObject($filename$method); 
  13.         $fp->seek($startLine-1);// 轉到第N行, seek方法參數從0開始計數 
  14.         for($i = 0; $i <= $count; ++$i) { 
  15.             $content[]=$fp->current();// current()獲取當前行內容 
  16.             $fp->next();// 下一行 
  17.         } 
  18.     }else{//PHP<5.1 
  19.         $fp = fopen($filename$method); 
  20.         if(!$fpreturn 'error:can not read file'
  21.         for ($i=1;$i<$startLine;++$i) {// 跳過前$startLine行 
  22.             fgets($fp); 
  23.         } 
  24.         for($i;$i<=$endLine;++$i){ 
  25.             $content[]=fgets($fp);// 讀取文件行內容 
  26.         } 
  27.         fclose($fp); 
  28.     } 
  29.     return array_filter($content); // array_filter過濾:false,null,'' 

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

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

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

使用,返回35270行-35280行的內容,代碼如下:

  1. echo '<pre>'
  2. var_dump(getFileLines('test.php',35270,35280)); 
  3. echo '</pre>'

再看一個實例,代碼如下:

  1. function readBigFile($filename$count = 20, $tag = "rn") {  
  2. $content = "";//最終內容  
  3. $current = "";//當前讀取內容寄存  
  4. $step= 1;//每次走多少字符  
  5. $tagLen = strlen($tag);  
  6. $start = 0;//起始位置  
  7. $i = 0;//計數器  
  8. $handle = fopen($filename,'r+');//讀寫模式打開文件,指針指向文件起始位置  
  9. while($i < $count && !feof($handle)) {  
  10. fseek($handle$start, SEEK_SET);//指針設置在文件開頭  
  11. $current = fread($handle,$step);//讀取文件  
  12. $content .= $current;//組合字符串  
  13. $start += $step;//依據步長向前移動  
  14. //依據分隔符的長度截取字符串最后免得幾個字符  
  15. $substrTag = substr($content, -$tagLen);  
  16. if ($substrTag == $tag) { //判斷是否為判斷是否是換行或其他分隔符  
  17. $i++;  
  18. $content .= "<br />";  
  19. }  
  20. }  
  21. //關閉文件  
  22. fclose($handle);  
  23. //返回結果  
  24. return $content;  
  25. }  
  26. $filename = "csdn.sql";//需要讀取的文件  
  27. $tag = "n";//行分隔符 注意這里必須用雙引號  
  28. $count = 100;//讀取行數  
  29. $data = readBigFile($filename,$count,$tag);  
  30. echo $data

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日本91av在线播放| 中文字幕精品久久久久| 国产激情久久久久| 亚洲欧美自拍一区| 欧美激情xxxx性bbbb| 欧美理论在线观看| 国产精品劲爆视频| 2019中文在线观看| 另类少妇人与禽zozz0性伦| 精品国产区一区二区三区在线观看| 日韩欧美一区视频| 久久精品99久久香蕉国产色戒| 亚洲欧美日韩天堂一区二区| 亚洲人成77777在线观看网| 精品福利一区二区| 亚洲有声小说3d| 中日韩美女免费视频网站在线观看| 国内精品一区二区三区| 精品香蕉一区二区三区| 性欧美在线看片a免费观看| 国产精品久久久久久久久久99| 亚洲国产欧美一区二区丝袜黑人| 日韩精品中文字幕久久臀| 九色91av视频| 777国产偷窥盗摄精品视频| 亚洲欧美国产制服动漫| 亚洲久久久久久久久久久| 国产日韩欧美另类| 久久香蕉精品香蕉| 2019日本中文字幕| 亚洲午夜激情免费视频| 欧美精品福利在线| 中文字幕日韩av| 一区二区三欧美| 2019国产精品自在线拍国产不卡| 久久综合五月天| 国产精品va在线| 久久久在线视频| 免费91麻豆精品国产自产在线观看| 亚洲天堂日韩电影| 国产日韩欧美电影在线观看| 日韩免费av片在线观看| 欧美性精品220| 高清一区二区三区日本久| 亚洲91精品在线| 精品国产拍在线观看| 亚洲影视九九影院在线观看| 成人黄色在线播放| 欧美又大又硬又粗bbbbb| 中文字幕精品一区二区精品| 国产精品一区二区久久久久| 在线日韩精品视频| 中文字幕亚洲精品| 亚洲福利视频久久| 成人精品久久一区二区三区| 日韩av观看网址| 美女久久久久久久| 最新亚洲国产精品| 亚洲欧美一区二区精品久久久| 国产最新精品视频| 亚洲视频在线播放| 欧美成人四级hd版| 亚洲精品网站在线播放gif| 永久免费毛片在线播放不卡| 亚洲国产精品va在看黑人| 91精品国产91久久久久| 韩曰欧美视频免费观看| 国产精品白嫩初高中害羞小美女| 91免费福利视频| 日韩av一区在线| 日韩电影在线观看中文字幕| 亚洲精品日韩久久久| 疯狂蹂躏欧美一区二区精品| 国产精品亚洲欧美导航| 影音先锋日韩有码| 国产精品黄色影片导航在线观看| 91精品视频免费看| 亚洲精品视频在线播放| 日韩成人激情在线| 亚洲欧美国产日韩中文字幕| 亚洲午夜激情免费视频| 国产精自产拍久久久久久蜜| 国内精品久久久久影院优| 国产精品热视频| 欧美成人三级视频网站| 欧洲精品在线视频| 97色伦亚洲国产| 久久久之久亚州精品露出| 97不卡在线视频| 久久人人爽人人爽人人片av高清| 日韩视频欧美视频| 久久伊人91精品综合网站| 国产91精品久久久久| 欧美www视频在线观看| 国产区亚洲区欧美区| 久久99精品久久久久久青青91| 两个人的视频www国产精品| 国产欧美日韩精品丝袜高跟鞋| 精品一区二区电影| 精品免费在线观看| 国产精品高清在线观看| 日韩视频在线一区| 久久久久久12| 成人午夜黄色影院| 日本韩国欧美精品大片卡二| 色噜噜狠狠狠综合曰曰曰88av| 亚洲欧美日韩中文视频| 91精品国产自产在线老师啪| 亚洲欧美在线第一页| 亚洲欧美日韩高清| 欧日韩不卡在线视频| 欧美乱大交做爰xxxⅹ性3| 国产成人一区二区在线| 亚洲国产精品免费| 国产日产欧美精品| 亚洲精品99久久久久| 91精品国产乱码久久久久久久久| 亚洲人精品午夜在线观看| 国产精品偷伦免费视频观看的| 久久91精品国产| 深夜福利日韩在线看| 欧美精品久久久久久久| 日韩经典中文字幕在线观看| 97久久精品国产| 国产亚洲欧洲黄色| 欧美高清videos高潮hd| 欧美理论电影网| 浅井舞香一区二区| 久久久天堂国产精品女人| 国产日韩精品在线播放| 欧美洲成人男女午夜视频| 久久久久久网站| 欧美日韩亚洲一区二| 日韩中文字幕在线| 日韩欧美一区二区三区| 中文字幕亚洲一区二区三区五十路| 亚洲精品999| 性亚洲最疯狂xxxx高清| 久久久久久久久久婷婷| 中文国产亚洲喷潮| 不卡伊人av在线播放| 亚洲欧美另类中文字幕| 91免费的视频在线播放| 日韩人在线观看| 亚洲福利视频网| 亚洲另类xxxx| 成人写真福利网| 亚洲日本中文字幕| 欧美在线视频观看| 亚洲网站在线播放| 性欧美办公室18xxxxhd| 国产成人激情视频| 久久久久成人网| 日韩视频在线观看免费| 777777777亚洲妇女| 精品国产欧美一区二区五十路| 成人h片在线播放免费网站| 亚洲精品福利在线| 久久理论片午夜琪琪电影网| 欧美精品成人91久久久久久久| 精品久久中文字幕久久av| 国产在线播放91| 久久综合伊人77777| 成人h猎奇视频网站|