资讯专栏INFORMATION COLUMN

关于php的yield生成器

Harriet666 / 747人阅读

摘要:今天分享一个特别好用的东西,里面的生成器才引入的功能,可以避免数组过大导致内存溢出的问题理解生成器关键字不是返回值,他的专业术语叫产出值,只是生成一个值,并不会立即生成所有结果集,所以内存始终是一条循环的值应用场景遍历文件目录读取超大文件日

今天分享一个特别好用的东西,php里面的生成器(PHP 5.5.0才引入的功能),可以避免数组过大导致内存溢出的问题

理解:生成器yield关键字不是返回值,他的专业术语叫产出值,只是生成一个值,并不会立即生成所有结果集,所以内存始终是一条循环的值

应用场景:
遍历文件目录
读取超大文件(log日志等)

下面就详细的来说一下用法
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);
    }
}

//调用

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

结果如下

2.读取超大文件

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

//调用

$glob = read_file("D:/phpStudy/PHPTutorial/WWW/log.txt");
while ($glob->valid()) {
    // 当前行文本
    $line = $glob->current();
    // 逐行处理数据
     echo $line;
     echo "
"; // 指向下一个,不能少 $glob->next(); }

结果如下

log.txt这个文件是12M

如果你觉得还不错,给我点个赞吧!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/31389.html

相关文章

  • 关于PHP协程与阻塞思考

    摘要:线程拥有自己独立的栈和共享的堆,共享堆,不共享栈,线程亦由操作系统调度标准线程是的。以及鸟哥翻译的这篇详细文档我就以他实现的协程多任务调度为基础做一下例子说明并说一下关于我在阻塞方面所做的一些思考。 进程、线程、协程 关于进程、线程、协程,有非常详细和丰富的博客或者学习资源,我不在此做赘述,我大致在此介绍一下这几个东西。 进程拥有自己独立的堆和栈,既不共享堆,亦不共享栈,进程由操作系...

    FullStackDeveloper 评论0 收藏0
  • PHP回顾之协程

    摘要:本文先回顾生成器,然后过渡到协程编程。其作用主要体现在三个方面数据生成生产者,通过返回数据数据消费消费者,消费传来的数据实现协程。解决回调地狱的方式主要有两种和协程。重点应当关注控制权转让的时机,以及协程的运作方式。 转载请注明文章出处: https://tlanyan.me/php-review... PHP回顾系列目录 PHP基础 web请求 cookie web响应 sess...

    Java3y 评论0 收藏0
  • Generator 异常处理

    摘要:的方法在中,提供了方法来抛出异常。总结关于生成器的异常处理,这里来进行一下总结。最近在研究使用实现半协程,而这个过程中,对异常的处理,是非常重要的。但是的运行方式决定了异常处理比较难以理解。 本文是我在研究 PHP 异步编程时的总结。对于相当多的 PHPer 来说,可能都不知道 Generator,或者对 Generaotr 的流程不是很熟悉。因为 Generator 使得程序不再是顺...

    Bmob 评论0 收藏0
  • PHP5.3、5.4、5.5、5.6各版本重要更新简述

    摘要:今天无事,偶尔看到中的版本选择处有关于各版本的区别的简短描述,于是总结一下。相对于之前版本,最大区别也就是命名空间和匿名函数了,这在平时开发和各大框架中都用的比较多了,就不再详述了。的主要更新是数组简写语法格式和了。 今天无事,偶尔看到phpstorm中的版本选择处有关于各版本的区别的简短描述,于是总结一下。 showImg(https://segmentfault.com/img/b...

    _ipo 评论0 收藏0
  • 上手并过渡到PHP7(5)——轻量级“集合”迭代器-Generator

    摘要:轻量级集合迭代器泊学视频链接泊阅文档链接是加入的新语言特性。接下来,我们可以像访问一个普通集合一样使用现在重新执行我们的文件,就不会再报错了。简单来说,就是一个轻量级的,可以记住自身状态的集合迭代器。 轻量级集合迭代器-Generator泊学视频链接泊阅文档链接Generator是PHP 5.5加入的新语言特性。但是,它似乎并没有被很多PHP开发者广泛采用。因此,在我们了解PHP 7对...

    wupengyu 评论0 收藏0

发表评论

0条评论

Harriet666

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<