赶知识网

php中yield的用法

php/mysql/apache PHP yield 内存溢出 2020-07-23发布 1605次点击

yield 解决的问题:解决运行内存的瓶颈,php程序中的变量存储在内存中,之前有遇到过读取Excel文件时候,会出现内存不足,出现:

Fatal Error: Allowed memory size of xxxxxx bytes 

所以会设置php 最大运行内存的设置: ini_set('memory_limit', '200M')

但是当我们读取5g 这么大的文件的时候,我们运行内存可能就吃不消了,所以会选择yield


初识Yield
运行:


<?php
function createRange($number){
    $data = [];
    for($i=0;$i<$number;$i++){
        $data[] = time();
    }
    return $data;
}
$data =createRange(10);
foreach($data as $value){
    sleep(1);//这里停顿1秒,我们后续有用
    echo $value.PHP_EOL;
}




时间是一样的。如果采用yield:


<?php


function createRange($number){
    for($i=0;$i<$number;$i++){
        yield time();
    }
}
$data =createRange(10);
foreach($data as $value){
    sleep(1);//这里停顿1秒,我们后续有用
    echo $value.PHP_EOL;
}



时间则间隔一秒钟,所以通过yield 的例子知道,不是像第一个例子中把for 循环的内容储存在内存中,而是一个一个消耗。


读取文件的例子
创建一个txt 文件写入:

<?php
function readTxt()
{
    # code...
    $handle = fopen("./test.txt", 'rb');


    while (feof($handle)===false) {
        # code...
        yield fgets($handle);
    }


    fclose($handle);
}


foreach (readTxt() as $key => $value) {
    # code...
    sleep(1);
    echo $value;
}


用php 读取文件,则是一行一行的读取


————————————————
版权声明:本文为CSDN博主「廖圣平」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_22823581/java/article/details/91491082

Top10

沪ICP备09053415号 © 赶知识网