日韩性视频-久久久蜜桃-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 | 国产成人av电影 | 黑人玩弄人妻一区二区三区 | 丰满人妻一区二区三区性色 | 激情综合站 | 国产精品高清网站 | 欧美操穴 | 日本jizzjizz| 国产精品嫩草影院精东 | 国产成人av影院 | 亚洲欧美另类国产 | 神马午夜影院 | 91成人国产 | japanese21ⅹxx日本| 91污网站 | 日韩在线视频不卡 | 免费麻豆视频 | 国产白丝一区二区三区 | 91美女视频在线观看 | 大地资源在线观看免费高清版粤语 | 国产无套视频 | 91偷拍网| 四虎成人在线观看 | 毛片aaaaaa | 91a视频 | 精品一区二区三区无码视频 | 观看av在线 | 国产人妻精品午夜福利免费 | 狠狠干影院 | 开心色婷婷| 美日韩成人av | 波多野结衣视频免费观看 | 国产午夜免费视频 | 亚洲久久久久 | 黄色网占 | 欧美精品在线视频观看 | 青草视频免费看 | 久草av在线播放 | 女人毛片视频 | 成人午夜福利一区二区 | 久久精品国产99久久久 | 亚洲欧美91 | 亚洲综合日韩精品欧美综合区 | 黑白配av | 日韩欧美网站 | 中文字幕偷拍 | 成人午夜免费在线观看 | 一级片一区二区三区 | 成人自拍偷拍 | 深夜福利免费在线观看 | 中文字幕1 | 色97| 九九这里只有精品视频 | 国产精品毛片视频 | 夜夜骑夜夜骑 | 国产亚洲一区二区三区四区 | 国产在线观看中文字幕 | 精品成人一区二区 | 日韩精品2 | av一级黄色 | 国产区av | 国产成人精品片 | 国产精品揄拍一区二区 | 久艹在线观看视频 | 久久久精品影视 | 日韩av在线看免费观看 | 特级西西444www大胆免费看 | 久久精品欧美视频 | 欧美性受xxxx黒人xyx性爽 | 欧美精品a区 | 久久久久久影院 | 国产色视频一区二区三区qq号 | 日韩欧美精品在线观看 | 哺乳援交吃奶在线播放 | 欲色影音| 日本免费在线播放 | 日韩欧美一区二区免费 | 免费黄网在线观看 | www.男人的天堂 | 欧美v日韩| 丰满人妻一区二区三区53 | 精品午夜福利在线观看 | gogo亚洲国模私拍人体 | 91极品视觉盛宴 | 精品欧美一区二区在线观看 | 大尺度做爰呻吟舌吻网站 | 天堂中文在线免费观看 | 国产乱淫av片免费看 | 日韩中文字幕视频 | 日韩成人在线视频 | 夜夜春很很躁夜夜躁 | 黄色成人在线免费观看 | 骚色综合| 银娇在线观看 | 黄色网入口 | 91在线精品一区二区 | 91高清视频在线观看 | 女同亚洲精品一区二区三 |