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

首頁 > 語言 > PHP > 正文

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

2024-05-04 23:44:41
字體:
來源:轉載
供稿:網友
這篇文章主要為大家詳細介紹了PHP讀取大文件的多種方法,感興趣的朋友可以參考一下
 

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

在PHP中,對于文件的讀取時,最快捷的方式莫過于使用一些諸如file、file_get_contents之類的函數,簡簡單單的幾行代碼就能 很漂亮的完成我們所需要的功能。但當所操作的文件是一個比較大的文件時,這些函數可能就顯的力不從心, 下面將從一個需求入手來說明對于讀取大文件時,常用的操作方法。

需求:
有一個800M的日志文件,大約有500多萬行, 用PHP返回最后幾行的內容。

實現方法:

1. 直接采用file函數來操作
  由于 file函數是一次性將所有內容讀入內存,而PHP為了防止一些寫的比較糟糕的程序占用太多的內存而導致系統內存不足,使服務器出現宕機,所以默認情況下限制只能最大使用內存16M,這是通過php.ini里的 memory_limit = 16M 來進行設置,這個值如果設置-1,則內存使用量不受限制。

下面是一段用file來取出這具文件最后一行的代碼:

<?php  ini_set('memory_limit', '-1');  $file = 'access.log';  $data = file($file);  $line = $data[count($data) - 1];  echo $line;?>

  整個代碼執行完成耗時 116.9613 (s)。
  我機器是2個G的內存,當按下F5運行時,系統直接變灰,差不多20分鐘后才恢復過來,可見將這么大的文件全部直接讀入內存,后果是多少嚴重,所以不在萬 不得以,memory_limit這東西不能調得太高,否則只有打電話給機房,讓reset機器了。

2.直接調用Linux的 tail 命令來顯示最 后幾行
  在Linux命令行下,可以直接使用 tail -n 10 access.log 很輕易的顯示日志文件最后幾行,可以直接用PHP來調用tail命令,執行PHP代碼如下:

<?php  $file = 'access.log';  $file = escapeshellarg($file); // 對命令行參數進行安全轉義  $line = `tail -n 1 $file`;  echo $line;?>

  整個代碼執行完成耗時 0.0034 (s)

3. 直接使用PHP的 fseek 來進行文件操作
  這種方式是最為普遍的方式,它不需要將文件的內容全部讀入內容,而是直接通過指針來操作,所以效率是相當高效的。在使用fseek來對文件進行操作時,也有多種不同的方法,效率可能也是略有差別的,下面是常用的兩種方法:

方法一
  首先通過fseek找到文件的最后一位EOF,然后找最后一行的起始位置,取這一行的數據,再找次一行的起始位置, 再取這一行的位置,依次類推,直到找到了$num行。
實現代碼如下

<?php$fp = fopen($file, "r");$line = 10;$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?>

  整個代碼執行完成耗時 0.0095 (s)

方法二
  還是采用fseek的方式從文件最后開始讀,但這時不是一位一位的讀,而是一塊一塊的讀,每讀一塊數據時,就將讀取后的數據放在一個buf里,然后通過換 行符(\n)的個數來判斷是否已經讀完最后$num行數據。
實現代碼如下

<?php$fp = fopen($file, "r");$num = 10;$chunk = 4096;$fs = sprintf("%u", filesize($file));$max = (intval($fs) == PHP_INT_MAX) ? PHP_INT_MAX : filesize($file);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) { preg_match("!(.*?\n){" . ($num) . "}$!", $readData, $match); $data = $match[0]; break; }}fclose($fp);echo $data;?>

整個代碼執行完成耗時 0.0009(s)。

方法三

<?phpfunction tail($fp, $n, $base = 5){ assert($n > 0); $pos = $n + 1; $lines = array(); while (count($lines) <= $n) { try {  fseek($fp, -$pos, SEEK_END); } catch (Exception $e) {  fseek(0);  break; } $pos *= $base; while (!feof($fp)) {  array_unshift($lines, fgets($fp)); } } return array_slice($lines, 0, $n);}var_dump(tail(fopen("access.log", "r+"), 10));?>

整個代碼執行完成耗時 0.0003(s)

方法四,PHP的stream_get_line函數 ,讀取快速,讀取50萬條數據大文件,大概需要20秒左右的時間!例子代碼如下

$fp = fopen('./iis.log', 'r'); //文件 while (!feof($fp)) {  //for($j=1;$j<=1000;$j++) {     //讀取下面的1000行并存儲到數組中  $logarray[] = stream_get_line($fp, 65535, "\n");     // break; // }   }

以上就是php讀取大文件的四種方法,希望對大家的學習有所幫助。



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

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产99久久精品一区二区永久免费| 成人福利视频网| 在线播放国产一区中文字幕剧情欧美| 91国产视频在线| 国产精品久久久久久搜索| 久久精品国产2020观看福利| 欧美激情在线狂野欧美精品| 国产欧美韩国高清| www.亚洲人.com| 91精品国产91久久久久久| 欧美极品在线播放| 精品久久久一区| 欧美日韩国产精品| 日本成人在线视频网址| 亚洲精品美女久久久| 国产欧美精品日韩| 日韩大片免费观看视频播放| 国产精品香蕉在线观看| 国产精品电影久久久久电影网| 有码中文亚洲精品| 国产精品一区久久久| 国产精品视频免费在线观看| 国产成人精品一区| 日韩性xxxx爱| 成人xvideos免费视频| 欧美激情按摩在线| 精品日本美女福利在线观看| 琪琪亚洲精品午夜在线| 日韩高清不卡av| 色婷婷亚洲mv天堂mv在影片| 日韩高清电影好看的电视剧电影| 在线亚洲欧美视频| 国产一区二区日韩精品欧美精品| 国产欧美韩国高清| 久久久久国产视频| 亚洲性生活视频在线观看| 福利视频第一区| 亚洲欧美日韩视频一区| 国产综合福利在线| 亚洲欧洲在线播放| 国产九九精品视频| 国产高清在线不卡| 成人免费自拍视频| 国产精品久久久久免费a∨| 欧美激情啊啊啊| 2019中文字幕全在线观看| 91精品国产高清自在线| 欧美日韩激情小视频| 亚洲无线码在线一区观看| www.日韩系列| 欧美另类极品videosbestfree| 久久久久九九九九| 国产精品视频一区二区三区四| 国产成人av在线播放| 亚洲无线码在线一区观看| 亚洲欧洲黄色网| 成人中文字幕在线观看| 欧美日韩亚洲一区二区| 欧美超级乱淫片喷水| 精品视频偷偷看在线观看| 91中文字幕在线观看| 亚洲第一级黄色片| 中文字幕精品久久久久| 日韩美女主播视频| 国产精品旅馆在线| 成人在线免费观看视视频| 午夜免费在线观看精品视频| 国产欧美日韩91| 国产精品入口免费视| 亚洲视频在线观看| 精品视频一区在线视频| 色偷偷91综合久久噜噜| 黄色成人av网| 亚洲免费av片| 欧美电影在线观看完整版| 午夜欧美不卡精品aaaaa| 成人av色在线观看| 欧洲精品久久久| 亚洲成人网在线| 国产精品一区二区久久国产| 国产脚交av在线一区二区| 国产精品高清在线| 国产精品一区二区久久久| 91中文在线视频| 91色视频在线观看| 亚洲电影免费在线观看| 蜜臀久久99精品久久久久久宅男| 国产精品精品一区二区三区午夜版| 中文字幕亚洲综合久久| 亚洲免费av片| 欧美日韩亚洲高清| 亚洲剧情一区二区| 自拍偷拍亚洲区| 亚洲天堂av女优| 91精品国产色综合久久不卡98口| 日韩少妇与小伙激情| 538国产精品一区二区免费视频| 国产香蕉97碰碰久久人人| 亚洲欧洲日韩国产| 欧美日韩国产一区二区| 久久久久久久一| 国产精品一久久香蕉国产线看观看| 国产999在线观看| 2018日韩中文字幕| 国产一区玩具在线观看| 亚洲精品98久久久久久中文字幕| 亚洲欧美日韩一区二区三区在线| 成人黄色网免费| 日韩视频―中文字幕| 欧美日韩性生活视频| 久久久999国产精品| 亚洲天堂成人在线视频| 久久91亚洲精品中文字幕| 伊人久久久久久久久久| 欧美激情网友自拍| 欧美性猛交xxxxx水多| 国产精品黄页免费高清在线观看| 久久久久在线观看| 国产在线观看精品一区二区三区| 亚洲成色999久久网站| 性欧美亚洲xxxx乳在线观看| 日韩毛片在线看| 88xx成人精品| 精品福利视频导航| 中文字幕综合在线| 国产精品人成电影在线观看| 中文字幕日韩有码| 亚洲最大成人免费视频| 亚洲黄页网在线观看| 超薄丝袜一区二区| 国产91网红主播在线观看| 亚洲精品视频在线观看视频| 欧美一区二区三区四区在线| 欧美日韩国产中文精品字幕自在自线| 最近中文字幕日韩精品| 欧美多人乱p欧美4p久久| 亚洲欧洲日本专区| 久久久久久久av| 亚洲欧美日韩中文在线制服| 97视频在线观看免费高清完整版在线观看| 欧美色道久久88综合亚洲精品| 亚洲免费福利视频| 欧美成aaa人片在线观看蜜臀| 欧洲亚洲妇女av| 精品中文字幕视频| 国产欧美va欧美va香蕉在| 欧美在线一区二区三区四| 亚洲aaa激情| 2020欧美日韩在线视频| 国产精品福利小视频| 国模私拍视频一区| 亚洲国产精品99久久| 亚洲综合在线小说| 精品久久久久久久久久ntr影视| 欧美日韩福利在线观看| 久久久精品2019中文字幕神马| 日韩中文字幕在线| 国产一区二区三区在线播放免费观看| 亚洲精品视频免费| 日韩av最新在线观看| 亚洲精品福利免费在线观看| www.欧美精品一二三区| 日韩av在线天堂网| 精品视频中文字幕|