最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2016年10月27日 09:06:00   作者:chenpingzhao  
本篇文章主要介紹了基于PHP讀取大文件的幾種方法,主要有3種方法。感興趣的朋友可以參考一下。

讀取大文件一直是一個(gè)頭痛的問題,我們像使用php開發(fā)讀取小文件可以直接使用各種函數(shù)實(shí)現(xiàn),但一到大文章就會(huì)發(fā)現(xiàn)常用的方法是無法正常使用或時(shí)間太長(zhǎng)太卡了,下面我們就一起來看看關(guān)于php讀取大文件問題解決辦法,希望例子能幫助到各位。

場(chǎng)景: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);
}
?>

運(yùn)行結(jié)果:10127784 行   共使用了,7.8764359951s

我的電腦是3G內(nèi)存,此方法不是推薦使用,因?yàn)樾枰盐募枯d入內(nèi)存

2、使用linux命令  tail

<?php
 
$starttime=microtime_float();
 
$file = 'testfile.txt';
$file = escapeshellarg($file); // 對(duì)命令行參數(shù)進(jìn)行安全轉(zhuǎn)義
$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

運(yùn)行結(jié)果:只使用了幾毫秒、輕松搞定、這種方法不能在windows下使用

3、使用fseek函數(shù)

這種方式是最為普遍的方式,它不需要將文件的內(nèi)容全部讀入內(nèi)容,因?yàn)镻HP是C寫的,所以實(shí)現(xiàn)的時(shí)候也類似C讀取文件,通過指針的移動(dòng),所以效率是相當(dāng)高效的。在使用fseek來對(duì)文件進(jìn)行操作時(shí),也有多種不同的方法,效率可能也是略有差別的,

下面是常用的幾種方法

方法一:使用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);//移動(dòng)指針
 $t = fgetc($fp);//獲取一個(gè)字符
 $pos--;//向前偏移
 }
 
 $t = "";
 $data = fgets($fp);//獲取當(dāng)前行的數(shù)據(jù)
 $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);
}
?>

運(yùn)行結(jié)果: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);
}
?>

運(yùn)行時(shí)間:0.00199198722839

使用fgets函數(shù),一行一行讀取

<?php
$file = fopen("testfile.txt","r");
 while(!feof($file))
 {
   echo fgets($file);
 }
 fclose($file);

spl庫(kù)函數(shù)

<?php
try{
  foreach( new SplFileObject('testfile.txt') as $line)
  echo $line.'<br />';
}catch (Exception $e){
  echo $e->getMessage();
}

另外網(wǎng)上有很多按照塊讀取文件的,有興趣的讀者可以試試,我試了沒成功,好像必須含有換行符“\n”才可以。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • laravel中的錯(cuò)誤與日志用法詳解

    laravel中的錯(cuò)誤與日志用法詳解

    這篇文章主要介紹了laravel中的錯(cuò)誤與日志用法,結(jié)合實(shí)例形式詳細(xì)分析了laravel中錯(cuò)誤與日志的相關(guān)設(shè)置與使用技巧,需要的朋友可以參考下
    2016-07-07
  • CI操作cookie的方法分析(基于helper類庫(kù))

    CI操作cookie的方法分析(基于helper類庫(kù))

    這篇文章主要介紹了CI操作cookie的方法,結(jié)合實(shí)例形式分析了CI使用helper類庫(kù)的cookie類庫(kù)實(shí)現(xiàn)操作cookie的相關(guān)技巧,需要的朋友可以參考下
    2016-03-03
  • 新版php?study根目錄下文件夾無法顯示的圖文解決方法

    新版php?study根目錄下文件夾無法顯示的圖文解決方法

    這篇文章主要介紹了新版php?study根目錄下文件夾無法顯示解決方法,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-12-12
  • Yii2框架配置文件(Application屬性)與調(diào)試技巧實(shí)例分析

    Yii2框架配置文件(Application屬性)與調(diào)試技巧實(shí)例分析

    這篇文章主要介紹了Yii2框架配置文件(Application屬性)與調(diào)試技巧,結(jié)合實(shí)例形式分析了Yii框架配置文件使用方法及記錄日志、調(diào)試等簡(jiǎn)單操作技巧,需要的朋友可以參考下
    2019-05-05
  • Redis使用Eval多個(gè)鍵值自增的操作實(shí)例

    Redis使用Eval多個(gè)鍵值自增的操作實(shí)例

    下面小編就為大家?guī)硪黄猂edis使用Eval 多個(gè)鍵值自增的操作實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-11-11
  • 開啟PHP的偽靜態(tài)模式

    開啟PHP的偽靜態(tài)模式

    偽靜態(tài)又名URL重寫,是動(dòng)態(tài)的網(wǎng)址看起來像靜態(tài)的網(wǎng)址。換句話說就是,動(dòng)態(tài)網(wǎng)頁(yè)通過重寫 URL 方法實(shí)現(xiàn)去掉動(dòng)態(tài)網(wǎng)頁(yè)的參數(shù),但在實(shí)際的網(wǎng)頁(yè)目錄中并沒有必要實(shí)現(xiàn)存在重寫的頁(yè)面
    2015-12-12
  • Yii2使用swiftmailer發(fā)送郵件的方法

    Yii2使用swiftmailer發(fā)送郵件的方法

    這篇文章主要介紹了Yii2使用swiftmailer發(fā)送郵件的方法,結(jié)合實(shí)例形式分析了Yii2使用swiftmailer進(jìn)行郵件發(fā)送的設(shè)置與代碼實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2016-05-05
  • 兩種php給圖片加水印的實(shí)現(xiàn)代碼

    兩種php給圖片加水印的實(shí)現(xiàn)代碼

    本文提供了兩種php給圖片加水印的實(shí)現(xiàn)代碼,其中一種是添加文字水印,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2015-07-07
  • thinkPHP內(nèi)置字符串截取函數(shù)用法詳解

    thinkPHP內(nèi)置字符串截取函數(shù)用法詳解

    這篇文章主要介紹了thinkPHP內(nèi)置字符串截取函數(shù)用法,結(jié)合實(shí)例形式分析了thinkPHP內(nèi)置的字符串截取函數(shù)功能與具體使用方法,以及針對(duì)無法添加省略號(hào)的源碼修改技巧,需要的朋友可以參考下
    2016-11-11
  • 基于php緩存的詳解

    基于php緩存的詳解

    本篇文章是對(duì)php中的緩存進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05

最新評(píng)論

册亨县| 休宁县| 闻喜县| 普宁市| 阜新市| 永清县| 广安市| 鄢陵县| 拜城县| 彭山县| 海安县| 伊吾县| 大悟县| 措美县| 新蔡县| 股票| 甘肃省| 柳州市| 会理县| 乌兰察布市| 宕昌县| 休宁县| 梨树县| 紫金县| 楚雄市| 疏勒县| 临沧市| 藁城市| 华坪县| 清新县| 临海市| 平陆县| 南岸区| 新郑市| 大港区| 共和县| 宁强县| 晴隆县| 新巴尔虎右旗| 鹿邑县| 蓬溪县|