一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

使用PHP讀取和解析大文件實戰(zhàn)

 太極混元天尊 2018-05-20

21CTO導(dǎo)讀:在現(xiàn)在這篇文章中,我們將一起學(xué)習(xí)處理PHP中的大文件,避免因內(nèi)存限制而無法使用的方法。


如果你想用PHP處理大文件,PHP提供了一些普通的PHP函數(shù),比如file_get_contents()或file()函數(shù),它們在處理超大文件時會存在一定局限性。


其中包括:


1.內(nèi)存限制 


上面這些函數(shù)依賴于php.ini中memory_limit的參數(shù)值設(shè)置,可以調(diào)整增加這些值,但這些函數(shù)仍然不適合極大的文件,因為這些函數(shù)會把整個文件內(nèi)容都讀入到內(nèi)存中。


如果文件的尺寸超過memory_limit的設(shè)置,這類文件都不會加載到內(nèi)存中?,F(xiàn)實中,比如我們有一個20G的的文件,想用PHP來處理,該怎么樣處理?


2.不太好的用戶體驗


還有一個限制是生產(chǎn)環(huán)境的速度問題。如果我們把它輸出到數(shù)組中,這樣經(jīng)常會出現(xiàn)在瀏覽器出現(xiàn)很長時間的等待,白頁或者出錯等情況。這樣給用戶的體驗不太好。


對于這種技術(shù)限制,可以使用yield關(guān)鍵字來直接生成一個結(jié)果。


SplFileObject Class


在本文中,我們告訴大家使用PHP標(biāo)準(zhǔn)庫中的SplFileObject類。


我們來演示,創(chuàng)建一個類來處理大文件。


這個類使用文件名做為輸入?yún)?shù)。如下代碼:


class BigFile

{

    protected $file;

 

    public function __construct($filename, $mode = 'r')

    {

        if (!file_exists($filename)) {

 

            throw new Exception('File not found');

        }

 

        $this->file = new SplFileObject($filename, $mode);

    }

 

}


接下來,我們定義一個遍歷文件的方法,這個方法將使用fgets()函數(shù)一次讀取文件一行。


我們也可以使用fread()函數(shù)的方法。


讀取文本文件


fgets()適用于解析包含換行符的文本文件,而fread()適用于解析二進制文件。


該函數(shù)用于遍歷文本文件的每一行內(nèi)容。


protected function iterateText()

{

    $count = 0;

 

    while (!$this->file->eof()) {

 

        yield $this->file->fgets();

 

        $count++;

    }

    return $count;

}


讀取二進制文件


來看另一個讀取二進制的文件:


protected function iterateBinary($bytes)

{

    $count = 0;

 

    while (!$this->file->eof()) {

 

        yield $this->file->fread($bytes);

 

        $count++;

    }

}


直接讀取


現(xiàn)在我們將定義一個采用迭代的類型,返回NoRewindIterator實例的方法。


我們使用NoRewindIterator強制單向讀取。


public function iterate($type = 'Text', $bytes = NULL)

{

    if ($type == 'Text') {

 

        return new NoRewindIterator($this->iterateText());

 

    } else {

 

        return new NoRewindIterator($this->iterateBinary($bytes));

    }

 

}


整個類源文件如下如示:


class BigFile

{

    protected $file;

 

    public function __construct($filename, $mode = 'r')

    {

        if (!file_exists($filename)) {

 

            throw new Exception('File not found');

 

        }

 

        $this->file = new SplFileObject($filename, $mode);

    }

 

    protected function iterateText()

    {

        $count = 0;

 

        while (!$this->file->eof()) {

 

            yield $this->file->fgets();

 

            $count++;

        }

        return $count;

    }

 

    protected function iterateBinary($bytes)

    {

        $count = 0;

 

        while (!$this->file->eof()) {

 

            yield $this->file->fread($bytes);

 

            $count++;

        }

    }

 

    public function iterate($type = 'Text', $bytes = NULL)

    {

        if ($type == 'Text') {

 

            return new NoRewindIterator($this->iterateText());

 

        } else {

 

            return new NoRewindIterator($this->iterateBinary($bytes));

        }

 

    }

}


解析大文件:


我們對類文件做如下測試:


$largefile = new BigFile('file.csv');

 

$iterator = $largefile->iterate('Text'); // Text or Binary based on your file type

 

foreach ($iterator as $line) {

 

    echo $line;

 

}


現(xiàn)在這個類可以讀取任何尺寸的大文件,沒有任何限制,無限大。


我們可以在Laravel項目中,將該類添加到composer.json文件中自動加載該類并直接使用。


從此,我們可以輕松使用PHP解析和處理大尺寸文件了。


Happy PHP Coding!


作者:飛花逐月

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    亚洲天堂精品1024| 欧美精品一区二区水蜜桃| 欧美精品久久男人的天堂| 九九热精品视频免费在线播放| 偷拍偷窥女厕一区二区视频 | 久热这里只有精品九九| 丰满少妇被猛烈撞击在线视频| 女同伦理国产精品久久久| 欧美一区二区三区播放| 好骚国产99在线中文| 91欧美亚洲视频在线| 久久精品一区二区少妇| 国产一区二区精品高清免费| 久热99中文字幕视频在线| 视频一区二区三区自拍偷| 久久精品国产亚洲av麻豆| 殴美女美女大码性淫生活在线播放| 亚洲精品蜜桃在线观看| 国产福利一区二区三区四区| 日本午夜免费福利视频 | 日本深夜福利视频在线| 69精品一区二区蜜桃视频| 亚洲欧美日本国产有色| 午夜精品福利视频观看| 日韩精品一区二区三区av在线| 五月天丁香婷婷狠狠爱| 日本乱论一区二区三区| 噜噜中文字幕一区二区| 日韩色婷婷综合在线观看| 精品国产亚洲免费91| 国产亚洲精品久久久优势| 97人妻精品一区二区三区男同| 粉嫩一区二区三区粉嫩视频| 风韵人妻丰满熟妇老熟女av | 色婷婷在线精品国自产拍| 欧美激情区一区二区三区| 午夜福利在线观看免费| 台湾综合熟女一区二区| 久久国产青偷人人妻潘金莲| 国产一二三区不卡视频| 美女被后入福利在线观看|