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

歡迎訪問(wèn) 生活随笔!

生活随笔

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

php

PHP几个快速读取大文件例子

發(fā)布時(shí)間:2025/4/5 php 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PHP几个快速读取大文件例子 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

PHP幾個(gè)快速讀取大文件例子

感謝 把我給崩了 的投遞 時(shí)間:2014-10-16 來(lái)源:三聯(lián) 

?在PHP中,對(duì)于文件的讀取時(shí),最快捷的方式莫過(guò)于使用一些諸如file、file_get_contents之類的函數(shù),簡(jiǎn)簡(jiǎn)單單的幾行代碼就能很漂亮的完成我們所需要的功能。但當(dāng)所操作的文件是一個(gè)比較大的文件時(shí),這些函數(shù)可能就顯的力不從心, 下面將從一個(gè)需求入手來(lái)說(shuō)明對(duì)于讀取大文件時(shí),常用的操作方法。

需求

有一個(gè)800M的日志文件,大約有500多萬(wàn)行, 用PHP返回最后幾行的內(nèi)容。

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

1. 直接采用file函數(shù)來(lái)操作

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

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

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

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

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

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

在Linux命令行下,可以直接使用 tail -n 10 access.log 很輕易的顯示日志文件最后幾行,可以直接用PHP來(lái)調(diào)用tail命令,執(zhí)行PHP代碼如下:

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

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

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

這種方式是最為普遍的方式,它不需要將文件的內(nèi)容全部讀入內(nèi)容,而是直接通過(guò)指針來(lái)操作,所以效率是相當(dāng)高效的。在使用fseek來(lái)對(duì)文件進(jìn)行操作時(shí),也有多種不同的方法,效率可能也是略有差別的,下面是常用的兩種方法:

方法一

首先通過(guò)fseek找到文件的最后一位EOF,然后找最后一行的起始位置,取這一行的數(shù)據(jù),再找次一行的起始位置, 再取這一行的位置,依次類推,直到找到了$num行。

#實(shí)現(xiàn)代碼如下

?代碼如下?
<?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
?>

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

方法二

還是采用fseek的方式從文件最后開(kāi)始讀,但這時(shí)不是一位一位的讀,而是一塊一塊的讀,每讀一塊數(shù)據(jù)時(shí),就將讀取后的數(shù)據(jù)放在一個(gè)buf里,然后通過(guò)換 行符(\n)的個(gè)數(shù)來(lái)判斷是否已經(jīng)讀完最后$num行數(shù)據(jù)。

#實(shí)現(xiàn)代碼如下

?代碼如下?
<?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;
?>

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

方法三

?代碼如下?

<?php
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));
?>

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

總結(jié)

以上是生活随笔為你收集整理的PHP几个快速读取大文件例子的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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

主站蜘蛛池模板: 在线色导航 | 精品国产一区二 | wwwyoujizz日本 | 欧美xxxx69| 色综合天天干 | 欧美bbw视频 | 91n在线观看| 免费在线视频一区二区 | 深夜精品福利 | 久久精品国产精品亚洲色婷婷 | 欧美亚洲视频一区 | 欧类av怡春院| 德国性经典xxxx性hd | ,国产精品国产三级国产 | 欧美日韩国产高清 | 国产精品老女人 | 日韩在线观看免费网站 | 国产区欧美区日韩区 | 国产精品久久久久久久免费看 | 国产精品久久AV无码 | 免费在线观看视频a | 西川结衣在线观看 | 毛片在哪看 | 亚洲人掀裙打屁股网站 | 国产区精品在线 | 精品在线视频免费观看 | 亚洲永久无码精品一区二区 | 日操干| 伊伊成人网 | 性天堂网| 99热视| 亚洲色图欧美在线 | 操比网站 | 天堂网av手机版 | 91网站在线免费观看 | 91蜜桃视频 | 制服丝袜在线看 | 蜜臀一区二区三区精品免费视频 | 97福利社| 日本黄色精品 | 欧美jizz欧美性大全 | 色屁屁一区二区 | 日韩美女视频19 | 奇米777色| 天堂网ww | 在线免费av网站 | av高清在线免费观看 | 日韩日韩日韩日韩日韩 | 激情一区 | 一卡二卡久久 | 韩日视频在线观看 | 老子影院午夜伦不卡大全 | 在线观看日韩国产 | 蜜臀aⅴ免费一区二区 | 黄色一级小视频 | 久久怡红院 | 变态 另类 国产 亚洲 | 情涩快播 | 国产又色又爽 | 99re在线视频免费观看 | 午夜伦理av| 美女又大又黄 | 亚洲一区日本 | 国产a国产片国产 | 精品无码免费视频 | 四虎色播| 欧美色乱| 天堂av2020| 熟妇高潮一区二区三区在线播放 | 日韩在线观看视频一区二区 | 久久中文字幕在线观看 | 成年人理论片 | 五月激情久久 | 激情午夜视频 | 国产夫妻自拍小视频 | 亚洲天堂不卡 | 欧美日韩一区精品 | 伊人88| 欧美成人乱码一二三四区免费 | 成人福利网 | 黄色一级片久久 | 色99视频 | 成年女人免费视频 | 一级片在线视频 | 久久久久在线视频 | 亚洲免费自拍 | www.99在线| 尹人综合| 四虎影院成人 | 欧美性猛交久久久久 | 久久嫩草 | 丰满少妇被猛烈进入高清播放 | 日韩在线视频网站 | 精品自拍视频 | 捆绑束缚调教 | 你懂的av在线 | 极品白嫩的小少妇 | 色啪综合| 一二三区中文字幕 |