成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

關(guān)于php的yield生成器

Harriet666 / 1052人閱讀

摘要:今天分享一個(gè)特別好用的東西,里面的生成器才引入的功能,可以避免數(shù)組過大導(dǎo)致內(nèi)存溢出的問題理解生成器關(guān)鍵字不是返回值,他的專業(yè)術(shù)語叫產(chǎn)出值,只是生成一個(gè)值,并不會立即生成所有結(jié)果集,所以內(nèi)存始終是一條循環(huán)的值應(yīng)用場景遍歷文件目錄讀取超大文件日

今天分享一個(gè)特別好用的東西,php里面的生成器(PHP 5.5.0才引入的功能),可以避免數(shù)組過大導(dǎo)致內(nèi)存溢出的問題

理解:生成器yield關(guān)鍵字不是返回值,他的專業(yè)術(shù)語叫產(chǎn)出值,只是生成一個(gè)值,并不會立即生成所有結(jié)果集,所以內(nèi)存始終是一條循環(huán)的值

應(yīng)用場景:
遍歷文件目錄
讀取超大文件(log日志等)

下面就詳細(xì)的來說一下用法
1.遍歷文件目錄

function glob2foreach($path, $include_dirs=false) {
    $path = rtrim($path, "/*");
    if (is_readable($path)) {
        $dh = opendir($path);
        while (($file = readdir($dh)) !== false) {
            if (substr($file, 0, 1) == ".")
                continue;
            $rfile = "{$path}/{$file}";
            if (is_dir($rfile)) {
                $sub = glob2foreach($rfile, $include_dirs);
                while ($sub->valid()) {
                    yield $sub->current();
                    $sub->next();
                }
                if ($include_dirs)
                    yield $rfile;
            } else {
                yield $rfile;
            }
        }
        closedir($dh);
    }
}

//調(diào)用

$glob = glob2foreach("D:/phpStudy/PHPTutorial/WWW");
//用于查看總共文件數(shù)量
$count = 0;
while ($glob->valid()) {
    $filename = $glob->current();
     echo $filename;
     echo "
"; $count++; // 指向下一個(gè),不能少 $glob->next(); } echo $count;

結(jié)果如下

2.讀取超大文件

function read_file($path) {
    if ($handle = fopen($path, "r")) {
        while (! feof($handle)) {
            yield trim(fgets($handle));
        }
        fclose($handle);
    }
}

//調(diào)用

$glob = read_file("D:/phpStudy/PHPTutorial/WWW/log.txt");
while ($glob->valid()) {
    // 當(dāng)前行文本
    $line = $glob->current();
    // 逐行處理數(shù)據(jù)
     echo $line;
     echo "
"; // 指向下一個(gè),不能少 $glob->next(); }

結(jié)果如下

log.txt這個(gè)文件是12M

如果你覺得還不錯(cuò),給我點(diǎn)個(gè)贊吧!

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/31389.html

相關(guān)文章

  • 關(guān)于PHP協(xié)程與阻塞思考

    摘要:線程擁有自己獨(dú)立的棧和共享的堆,共享堆,不共享?xiàng)?,線程亦由操作系統(tǒng)調(diào)度標(biāo)準(zhǔn)線程是的。以及鳥哥翻譯的這篇詳細(xì)文檔我就以他實(shí)現(xiàn)的協(xié)程多任務(wù)調(diào)度為基礎(chǔ)做一下例子說明并說一下關(guān)于我在阻塞方面所做的一些思考。 進(jìn)程、線程、協(xié)程 關(guān)于進(jìn)程、線程、協(xié)程,有非常詳細(xì)和豐富的博客或者學(xué)習(xí)資源,我不在此做贅述,我大致在此介紹一下這幾個(gè)東西。 進(jìn)程擁有自己獨(dú)立的堆和棧,既不共享堆,亦不共享?xiàng)?,進(jìn)程由操作系...

    FullStackDeveloper 評論0 收藏0
  • PHP回顧之協(xié)程

    摘要:本文先回顧生成器,然后過渡到協(xié)程編程。其作用主要體現(xiàn)在三個(gè)方面數(shù)據(jù)生成生產(chǎn)者,通過返回?cái)?shù)據(jù)數(shù)據(jù)消費(fèi)消費(fèi)者,消費(fèi)傳來的數(shù)據(jù)實(shí)現(xiàn)協(xié)程。解決回調(diào)地獄的方式主要有兩種和協(xié)程。重點(diǎn)應(yīng)當(dāng)關(guān)注控制權(quán)轉(zhuǎn)讓的時(shí)機(jī),以及協(xié)程的運(yùn)作方式。 轉(zhuǎn)載請注明文章出處: https://tlanyan.me/php-review... PHP回顧系列目錄 PHP基礎(chǔ) web請求 cookie web響應(yīng) sess...

    Java3y 評論0 收藏0
  • Generator 異常處理

    摘要:的方法在中,提供了方法來拋出異常??偨Y(jié)關(guān)于生成器的異常處理,這里來進(jìn)行一下總結(jié)。最近在研究使用實(shí)現(xiàn)半?yún)f(xié)程,而這個(gè)過程中,對異常的處理,是非常重要的。但是的運(yùn)行方式?jīng)Q定了異常處理比較難以理解。 本文是我在研究 PHP 異步編程時(shí)的總結(jié)。對于相當(dāng)多的 PHPer 來說,可能都不知道 Generator,或者對 Generaotr 的流程不是很熟悉。因?yàn)?Generator 使得程序不再是順...

    Bmob 評論0 收藏0
  • PHP5.3、5.4、5.5、5.6各版本重要更新簡述

    摘要:今天無事,偶爾看到中的版本選擇處有關(guān)于各版本的區(qū)別的簡短描述,于是總結(jié)一下。相對于之前版本,最大區(qū)別也就是命名空間和匿名函數(shù)了,這在平時(shí)開發(fā)和各大框架中都用的比較多了,就不再詳述了。的主要更新是數(shù)組簡寫語法格式和了。 今天無事,偶爾看到phpstorm中的版本選擇處有關(guān)于各版本的區(qū)別的簡短描述,于是總結(jié)一下。 showImg(https://segmentfault.com/img/b...

    _ipo 評論0 收藏0
  • 上手并過渡到PHP7(5)——輕量級“集合”迭代器-Generator

    摘要:輕量級集合迭代器泊學(xué)視頻鏈接泊閱文檔鏈接是加入的新語言特性。接下來,我們可以像訪問一個(gè)普通集合一樣使用現(xiàn)在重新執(zhí)行我們的文件,就不會再報(bào)錯(cuò)了。簡單來說,就是一個(gè)輕量級的,可以記住自身狀態(tài)的集合迭代器。 輕量級集合迭代器-Generator泊學(xué)視頻鏈接泊閱文檔鏈接Generator是PHP 5.5加入的新語言特性。但是,它似乎并沒有被很多PHP開發(fā)者廣泛采用。因此,在我們了解PHP 7對...

    wupengyu 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<