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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > php >内容正文

php

php中读取大文件实现方法详解

發(fā)布時(shí)間:2025/4/9 php 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php中读取大文件实现方法详解 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

php中讀取大文件實(shí)現(xiàn)方法詳解

來源:???時(shí)間:2013-09-05 19:27:01???閱讀數(shù):6186

分享到:0

[導(dǎo)讀]?本文章來給各位同學(xué)介紹php中讀取大文件實(shí)現(xiàn)方法詳解吧,有需要了解的同學(xué)可進(jìn)入?yún)⒖紖⒖?。需求如?#xff1a; 現(xiàn)有一個(gè)1G左右的日志文件,大約有500多萬行, 用php返回最后幾行的內(nèi)容。實(shí)現(xiàn)方法:1 直接采用file函數(shù)

本文章來給各位同學(xué)介紹php中讀取大文件實(shí)現(xiàn)方法詳解吧,有需要了解的同學(xué)可進(jìn)入?yún)⒖紖⒖肌?

需求如下: 現(xiàn)有一個(gè)1G左右的日志文件,大約有500多萬行, 用php返回最后幾行的內(nèi)容。

實(shí)現(xiàn)方法:

1. 直接采用file函數(shù)來操作
注: 由于 file函數(shù)是一次性將所有內(nèi)容讀入內(nèi)存,而php為了防止一些寫的比較糟糕的程序占用太多的內(nèi)存而導(dǎo)致系統(tǒng)內(nèi)存不足,使服務(wù)器出現(xiàn)宕機(jī),所以默認(rèn)情況下 限制只能最大使用內(nèi)存16M,這是通過php.ini里的memory_limit = 16M來進(jìn)行設(shè)置,這個(gè)值如果設(shè)置-1,則內(nèi)存使用量不受限制.

下面是一段用file來取出這具文件最后一行的代碼.
整個(gè)代碼執(zhí)行完成耗時(shí) 116.9613 (s).

?代碼如下復(fù)制代碼
ini_set('memory_limit','-1');
$file = 'access.log';
$data = file($file);
$line = $data[count($data)-1];
echo $line;?

我機(jī)器是2個(gè)G的內(nèi)存,當(dāng)按下F5運(yùn)行時(shí),系統(tǒng)直接變灰,差不多20分鐘后才恢復(fù)過來,可見將這么大的文件全部直接讀入內(nèi)存,后果是多少嚴(yán)重,所以不在萬不得以,memory_limit這東西不能調(diào)得太高,否則只有打電話給機(jī)房,讓reset機(jī)器了.

2.直接調(diào)用linux的tail命令來顯示最后幾行

在linux命令行下,可以直接使用tail -n 10 access.log很輕易的顯示日志文件最后幾行,可以直接用php來調(diào)用tail命令,執(zhí)行php代碼如下.
整個(gè)代碼執(zhí)行完成耗時(shí) 0.0034 (s)

?代碼如下復(fù)制代碼
file = 'access.log';
$file = escapeshellarg($file); // 對命令行參數(shù)進(jìn)行安全轉(zhuǎn)義
$line = `tail -n 1 $file`;
echo $line;?

3. 直接使用php的fseek來進(jìn)行文件操作

這種方式是最為普遍的方式,它不需要將文件的內(nèi)容全部讀入內(nèi)存,而是直接通過指針來操作,所以效率是相當(dāng)高效的.在使用fseek來對文件進(jìn)行操作時(shí),也有多種不同的方法,效率可能也是略有差別的,下面是常用的兩種方法.
方法一:
首先通過fseek找到文件的最后一位EOF,然后找最后一行的起始位置,取這一行的數(shù)據(jù),再找次一行的起始位置,再取這一行的位置,依次類推,直到找到了$num行。
實(shí)現(xiàn)代碼如下

整個(gè)代碼執(zhí)行完成耗時(shí) 0.0095 (s)

?代碼如下復(fù)制代碼

function 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));

方法二 :

還是采用fseek的方式從文件最后開始讀,但這時(shí)不是一位一位的讀,而是一塊一塊的讀,每讀一塊數(shù)據(jù)時(shí),就將讀取后的數(shù)據(jù)放在一個(gè)buf里,然后通過換行符(n)的個(gè)數(shù)來判斷是否已經(jīng)讀完最后$num行數(shù)據(jù).
實(shí)現(xiàn)代碼如下
整個(gè)代碼執(zhí)行完成耗時(shí) 0.0009(s).

?代碼如下復(fù)制代碼

$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

方法三:

整個(gè)代碼執(zhí)行完成耗時(shí) 0.0003(s)

?代碼如下復(fù)制代碼

$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;

?

轉(zhuǎn)載于:https://www.cnblogs.com/u0mo5/p/4424955.html

總結(jié)

以上是生活随笔為你收集整理的php中读取大文件实现方法详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: av无遮挡 | 色撸撸在线视频 | 91爽爽 | 公侵犯人妻中文字慕一区二区 | ass亚洲肉体欣赏pics | 久久精品8 | jizz欧美| 国产精品综合视频 | 无码人妻aⅴ一区二区三区69岛 | 久久噜噜噜精品国产亚洲综合 | 亚洲一区二区在线视频 | 国产熟女一区二区 | 亚洲无码一区二区三区 | 成人91| 婷婷综合一区 | 亚洲AV成人无码网站天堂久久 | 国产探花在线观看 | 小柔的裸露日记h | 91福利视频网站 | 综合成人在线 | 亚洲免费网 | 一级性生活毛片 | av在线操| 大尺度网站在线观看 | 日本免费一区二区视频 | 国产成人精品a视频一区 | 国产精品69久久久久 | 亚洲精品国产视频 | 日韩无码精品一区二区 | 日美韩一区二区三区 | 久久人人视频 | 国产20页 | 天天插天天插 | 哪里可以免费看毛片 | 国产精品av在线免费观看 | 日韩少妇精品 | 九热视频在线观看 | 亚洲人成久久 | 久久精品国产亚洲av嫖农村妇女 | 手机免费av | 久久综合一本 | 亚洲无线看 | 成人在线手机视频 | 丰满少妇被猛烈进入 | 国产精品一二三四区 | 天天都色 | 日韩视频一区二区 | 在线不卡的av | 国产精品一区二区av白丝下载 | 国产毛片在线看 | 日韩aⅴ在线观看 | 亚洲精品久久 | 久久噜噜噜精品国产亚洲综合 | 成年人网站免费观看 | 日本一级吃奶淫片免费 | 国产丝袜美女 | 六月婷婷久久 | 农村妇女愉情三级 | 欧美熟妇另类久久久久久多毛 | 国产精品久久久久三级无码 | 夜夜高潮夜夜爽 | 欧美特黄视频 | 老司机精品视频网站 | 亚洲免费看av | av黄色天堂 | 欧美日韩二三区 | 免费日批视频 | 丰满岳妇伦在线播放 | 日本不卡1| 日韩精品一区二区三区四区 | 亚洲午夜精品一区二区三区 | 91gao| 丝袜国产在线 | 久久综合精品国产二区无码不卡 | 亚洲av成人精品一区二区三区在线播放 | 欧美一区二区三区视频 | 中国18videosex极品 | 欧美激情精品久久久久久蜜臀 | 另一种灿烂生活 | 松本一香在线播放 | 色在线影院 | 波多野结衣亚洲一区二区 | 精品成人免费视频 | 色屁屁www影院免费观看入口 | 黄a免费网络 | 与亲女洗澡时伦了毛片 | 天天干夜夜添 | 中文字幕有码无码人妻av蜜桃 | 桃色视频在线 | 激情久久婷婷 | 亚洲va天堂va欧美ⅴa在线 | 亚洲一区欧美日韩 | av手机网站 | 美女污软件 | 在线观看免费av网站 | 国产精品白嫩极品美女 | 久久久美女视频 | 亚洲男人的天堂在线 | 久久久久女教师免费一区 |