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

首頁 > 編程 > PHP > 正文

PHP如何快速讀取大文件

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

    需求需求

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

    實現方法

    1. 直接采用file函數來操作

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

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

    1    <?php2    ini_set('memory_limit', '-1');3    $file = 'access.log';4    $data = file($file);5    $line = $data[count($data) - 1];6    echo $line;7    ?>

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

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

    2.直接調用Linux的 tail 命令來顯示最 后幾行

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

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

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

    3. 直接使用PHP的 fseek 來進行文件操作

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

    方法一

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

    #實現代碼如下

    01    <?php02    $fp = fopen($file, "r");03    $line = 10;04    $pos = -2;05    $t = " ";06    $data = "";07    while ($line > 0)08    {09        while ($t != "/n")10        {11            fseek($fp, $pos, SEEK_END);12            $t = fgetc($fp);13            $pos--;14        }15        $t = " ";16        $data .= fgets($fp);17        $line--;18    }19    fclose($fp);20    echo $data21    ?>

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

    方法二

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

    #實現代碼如下

    01    <?php02    $fp = fopen($file, "r");03    $num = 10;04    $chunk = 4096;05    $fs = sprintf("%u", filesize($file));06    $max = (intval($fs) == PHP_INT_MAX) ? PHP_INT_MAX : filesize($file);07    for ($len = 0; $len < $max; $len += $chunk)08    {09        $seekSize = ($max - $len > $chunk) ? $chunk : $max - $len;10        fseek($fp, ($len + $seekSize) * -1, SEEK_END);11        $readData = fread($fp, $seekSize) . $readData;12        if (substr_count($readData, "/n") >= $num + 1)13        {14            preg_match("!(.*?/n){" . ($num) . "}$!", $readData, $match);15            $data = $match[0];16            break;17        }18    }19    fclose($fp);20    echo $data;21    ?>

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

    方法三

    01    <?php02    function tail($fp, $n, $base = 5)03    {04        assert($n > 0);05        $pos = $n + 1;06        $lines = array();07        while (count($lines) <= $n)08        {09            try10            {11                fseek($fp, -$pos, SEEK_END);12            }13            catch (Exception $e)14            {15                fseek(0);16                break;17            }18            $pos *= $base;19            while (!feof($fp))20            {21                array_unshift($lines, fgets($fp));22            }23        }24     25        return array_slice($lines, 0, $n);26    }27     28    var_dump(tail(fopen("access.log", "r+"), 10));29    ?>

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

    PHP編程

    鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

  • 發表評論 共有條評論
    用戶名: 密碼:
    驗證碼: 匿名發表
    亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
    欧美激情奇米色| 亚洲天堂精品在线| 欧美肥老妇视频| 国产精品户外野外| 国产成人精品视| 69国产精品成人在线播放| 日韩欧美国产成人| 欧美大尺度电影在线观看| 91成人国产在线观看| 疯狂蹂躏欧美一区二区精品| 久久激情视频免费观看| 亚洲天堂av女优| 国产精品久久久久久久久久久久久久| 国产亚洲精品久久久久久牛牛| 亚洲经典中文字幕| 久久久在线观看| 久久久免费av| 欧美一区二区三区免费观看| 国产精品老女人视频| 日韩美女在线观看| 欧美日韩国产一区中文午夜| 日本19禁啪啪免费观看www| 欧美电影在线观看完整版| 欧美成人剧情片在线观看| 亚洲天堂av图片| 国产中文日韩欧美| 午夜精品一区二区三区在线视频| 欧美成aaa人片免费看| 中文在线资源观看视频网站免费不卡| 欧美一级bbbbb性bbbb喷潮片| 欧美特级www| 久久天天躁狠狠躁夜夜躁2014| 美日韩精品免费视频| 日韩视频一区在线| 国产乱人伦真实精品视频| 亚洲aaa激情| 欧美一级大片在线免费观看| 亚洲午夜激情免费视频| 亚洲第一福利在线观看| 91麻豆桃色免费看| 成人免费在线网址| 亚洲国产精彩中文乱码av在线播放| xvideos亚洲人网站| www.亚洲一二| 欧美一级大片视频| 日韩经典第一页| 日韩在线视频一区| 日韩国产一区三区| 欧美亚洲国产视频| 久久久久成人网| 国产成人av网址| 在线成人激情视频| 国产aⅴ夜夜欢一区二区三区| 日韩视频免费大全中文字幕| 美女av一区二区三区| 久久精品电影网站| 91天堂在线观看| 欧美国产日韩一区| 日韩影视在线观看| 欧美日韩高清区| 久久99精品久久久久久青青91| 国产偷国产偷亚洲清高网站| 国产精品亚洲美女av网站| 国产亚洲欧洲黄色| 亚洲精品福利在线| 6080yy精品一区二区三区| 97精品欧美一区二区三区| 亚洲国产一区二区三区在线观看| 萌白酱国产一区二区| 国产69精品久久久久9| 国产欧美日韩精品丝袜高跟鞋| 国产成人小视频在线观看| 欧美乱妇40p| 91av在线播放| 神马久久久久久| 日韩在线视频二区| 亚洲国产精品福利| 日韩a**站在线观看| 日韩电影中文字幕av| 日韩h在线观看| 91免费的视频在线播放| 欧美日韩电影在线观看| 久久久亚洲成人| 国产大片精品免费永久看nba| 日韩国产高清视频在线| 国产成人亚洲精品| 亚洲第一男人av| 欧美激情综合色综合啪啪五月| 九九热视频这里只有精品| 欧美在线观看日本一区| 中文字幕一精品亚洲无线一区| 日韩在线视频一区| 97在线看免费观看视频在线观看| 自拍偷拍亚洲欧美| 91精品啪在线观看麻豆免费| 欧美成人激情视频| 亚洲小视频在线观看| 日韩**中文字幕毛片| 成人深夜直播免费观看| 亚洲精品国产精品久久清纯直播| 中文字幕日韩精品在线| 欧美日韩高清在线观看| 26uuu久久噜噜噜噜| 国产日韩欧美电影在线观看| 三级精品视频久久久久| 91热福利电影| 欧美巨乳美女视频| 欧美日韩一区二区免费在线观看| 日韩女在线观看| 51精品在线观看| 国产视频在线观看一区二区| 国产亚洲精品一区二区| 国产人妖伪娘一区91| 91在线高清免费观看| 欧美在线视频在线播放完整版免费观看| 欧美激情高清视频| 国产精品网红福利| 色噜噜狠狠色综合网图区| 久久精品国产69国产精品亚洲| 91色精品视频在线| 中文字幕亚洲欧美在线| 国自在线精品视频| 91av在线免费观看视频| 亚洲视频精品在线| 日韩在线视频二区| 欧美乱妇高清无乱码| 日韩av有码在线| 国产亚洲福利一区| 欧美日韩激情小视频| 欧美在线性视频| 欧美丝袜美女中出在线| 4438全国亚洲精品在线观看视频| 日韩精品小视频| 日韩视频一区在线| 国产精品96久久久久久又黄又硬| 欧美日韩精品国产| 欧美小视频在线观看| 久久久久久久久久亚洲| 中文字幕日韩有码| 成人免费自拍视频| 91久久久国产精品| 国产亚洲欧洲高清| 国产91色在线| 91av在线免费观看| 亚洲国产精品99| 91久久嫩草影院一区二区| 国产视频观看一区| 色偷偷av亚洲男人的天堂| 日韩免费观看高清| 日韩av在线免费播放| 亚洲综合色av| 亚洲美女www午夜| 亚洲国产精品久久久久| 国产精品最新在线观看| 国产欧美久久久久久| 韩日精品中文字幕| 国产激情视频一区| 欧美性理论片在线观看片免费| 91在线无精精品一区二区| 欧美精品18videosex性欧美| 国产一区二区香蕉| 久久久视频精品| 国模极品一区二区三区| 日韩欧美在线视频日韩欧美在线视频|