网站首页php

PHP使用yield迭代器处理大数据量读取

发布时间:2017-07-04 08:57:11编辑:slayer.hover阅读(781)

    yield迭代器是在php5.5加入的新特性,可用于大数据库的循环体,如数据库大数据量的读写操作。

    时间换空间,以较小的内存损耗完成大量数据的处理。


    上代码:

    一、不使用迭代器

    $start   =    microtime(true);
    $_DB     =    new DB($dbconfig);
    $sql   =    "SELECT * FROM `table` limit 0,100000";
    $stat   =    $_DB->getAll($sql);
    foreach($stat as $row) {
        print_r($row);
    }
    $time = round(microtime(true) - (float)$start, 5);
    echo '统计,  时间:',$time,'    内存:', (memory_get_usage(true) / 1024), "kb\r\n";

    统计结果, 时间:0.2053    内存:82176kb


    二、使用迭代器

    $start =    microtime(true);
    $_DB    =    new DB($dbconfig);
    function getData($_DB){
        $sql = "SELECT * FROM `table` limit 0,100000";
        $stat = $_DB->pdo->query($sql);
        while ($row = $stat->fetch()) {
            yield $row;
        }
    }
    foreach(getData($_DB) as $row) {
        print_r($row);
    }
    $time = round(microtime(true) - (float)$start, 5);
    echo '统计,  时间:',$time,'    内存:', (memory_get_usage(true) / 1024), "kb\r\n";

    统计结果, 时间:0.25995    内存:1024kb


    由于机子比较弱, 不使用迭代器的情况下, limit超过20000就报警:

    Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 1 bytes)。

    但使用yield的话,多大的limit都没问题。

    至于运行效率,既然用时间换空间了,就不用怎么考虑了 :)

评论