国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > PHP > 正文

PHP讀取大文件的幾種方法介紹

2024-05-04 23:51:32
字體:
來源:轉載
供稿:網友

讀取大文件一直是一個頭痛的問題,我們像使用php開發讀取小文件可以直接使用各種函數實現,但一到大文章就會發現常用的方法是無法正常使用或時間太長太卡了,下面我們就一起來看看關于php讀取大文件問題解決辦法,希望例子能幫助到各位。

場景:PHP讀取超大文件,例如1G的日志文件,我這里使用的是400M的access.log文件

1、使用file直接讀取

<?php$starttime=microtime_float(); ini_set('memory_limit', '-1');$file = 'testfile.txt'; $data = file($file);$line = $data[count($data) - 1000];$endtime=microtime_float(); echo count($data),"<br/>";echo $endtime-$starttime; function microtime_float(){  list($usec, $sec) = explode(" ", microtime());  return ((float)$usec + (float)$sec);}?>

運行結果:10127784 行   共使用了,7.8764359951s

我的電腦是3G內存,此方法不是推薦使用,因為需要把文件全部載入內存

2、使用linux命令  tail

<?php $starttime=microtime_float(); $file = 'testfile.txt';$file = escapeshellarg($file); // 對命令行參數進行安全轉義$line = `tail -n 100 $file`; echo $line,"<br/>"; $endtime=microtime_float();echo $endtime-$starttime; function microtime_float(){  list($usec, $sec) = explode(" ", microtime());  return ((float)$usec + (float)$sec);} //end

運行結果:只使用了幾毫秒、輕松搞定、這種方法不能在windows下使用

3、使用fseek函數

這種方式是最為普遍的方式,它不需要將文件的內容全部讀入內容,因為PHP是C寫的,所以實現的時候也類似C讀取文件,通過指針的移動,所以效率是相當高效的。在使用fseek來對文件進行操作時,也有多種不同的方法,效率可能也是略有差別的,

下面是常用的幾種方法

方法一:使用fopen打開文件(從文件指針資源句柄)

<?php$starttime=microtime_float(); $file = 'testfile.txt';$fp = fopen($file, "r+"); $line = 100;$pos = -2;$t =$data=""; while ($line > 0){ while ($t != "/n") //換行符 { fseek($fp, $pos, SEEK_END);//移動指針 $t = fgetc($fp);//獲取一個字符 $pos--;//向前偏移 }  $t = ""; $data = fgets($fp);//獲取當前行的數據 $line--;}fclose($fp);echo $data,"<br/>";$endtime=microtime_float(); echo $endtime-$starttime; function microtime_float(){  list($usec, $sec) = explode(" ", microtime());  return ((float)$usec + (float)$sec);}?>

運行結果:0.338493108749

方法二:一塊一塊的讀取

<?php$starttime=microtime_float(); $file = 'testfile.txt';$fp = fopen($file, "r");$num = 10;$chunk = 4096;//4K的塊$fs = sprintf("%u", filesize($file));$readData='';$max = (intval($fs) == PHP_INT_MAX) ? PHP_INT_MAX : $fs; for($len = 0; $len < $max; $len += $chunk){  $seekSize = ($max - $len > $chunk) ? $chunk : $max - $len; fseek($fp, ($len + $seekSize) * -1, SEEK_END); $readData = fread($fp, $seekSize) . $readData; if (substr_count($readData, "/n") >= $num + 1) {   $ns=substr_count($readData, "/n")-$num+2;  preg_match('/(.*?/n){'.$ns.'}/',$readData,$match);  $data = $match[1];  break;}}fclose($fp);echo $data,"<br/>";  $endtime=microtime_float(); echo $endtime-$starttime; function microtime_float(){  list($usec, $sec) = explode(" ", microtime());  return ((float)$usec + (float)$sec);}?>

運行時間:0.00199198722839

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 内丘县| 长治县| 武夷山市| 银川市| 垣曲县| 合肥市| 丰城市| 大化| 扎兰屯市| 瑞丽市| 陕西省| 棋牌| 子长县| 新和县| 黑龙江省| 黎川县| 锡林郭勒盟| 长海县| 宣化县| 新巴尔虎右旗| 夏津县| 贡山| 长丰县| 长乐市| 桑植县| 三原县| 威宁| 舒兰市| 曲周县| 黎川县| 肇源县| 承德市| 晋宁县| 黄平县| 蒙阴县| 宜兰县| 西乌珠穆沁旗| 盐源县| 麟游县| 安岳县| 庄浪县|