PHP生成器yield处理大量数据业务(代码示例)-php教程

资源魔 45 0

民间诠释yield

yield天生器php5.5之后呈现的,民间文档这样诠释:yield提供了一种更易的办法来完成简略的迭代工具,相比拟界说类完成 Iterator 接口的形式,功能开支以及复杂性年夜年夜升高。

天生器的外围是一个yield要害字,一个天生器函数看起来像一个一般的函数,没有同的是:一般函数前往一个值,而一个天生器能够yield天生许多它所需求的值。天生器函数被挪用时,前往的是一个能够被遍历的工具。

yield以及return有点相似,不外没有同的是,return会前往值而且终止代码的执行,而yield会前往一个值给轮回挪用今生成器的代码而且只是暂停执行天生器函数。

这里趁便给各人引见一下php版本的非缓冲查问

意义便是 把数据一行行 读取到php运转内存,并不是一次性读取到php运转内存,家喻户晓,php有不少内置函数,能够协助咱们对数据进行加工操作,由于数据都正在内存外面,以是能操作,然而php的运转内存是有极限,默许128M。

留意:由于非缓冲查问是 会长期衔接数据库的,有可能会造成慢查问、锁表之类的状况,比拟耗mysql资本

绝对非缓冲查问就是 缓冲查问:

假如用缓存查问,php内存就会间接爆了,呈现内存有余的状况。好了,这里次要是为了突出yield

yield功能

天生器会对PHP使用的功能有十分年夜的影响

PHP代码运转时节流年夜量的内存

比拟适宜较量争论年夜量的数据

yield运

天生器容许你正在 foreach 代码块中写代码来迭代一组数据而没有需求正在内存中创立一个数组,那会使你的内存达到下限,或许会盘踞可观的解决工夫。相同,你能够写一个天生器函数,就像一个一般的自界说函数同样, 以及一般函数只前往一次没有同的是, 天生器能够依据需求 yield 屡次,以便天生需求迭代的值。

例子解说

8884ab831422af02f205f33774502e2.png

我这里只是构建了一个数组来给各人演示,平时你正在操作数据库输入数据也是同样的。转为array

//仓库库存扣除了测试
public function cangku_stock()
{
    //set_time_limit(0);  //示意永世运转,这里我是测试array的时分用到的
    $order_info = $this->read_temp_api_order_info(10);  //这里我就测试了10条数据,成果是看没有进去的
    foreach($order_info as $temp_api_order_info){
        dd($temp_api_order_info);  //打印进去看看数据
        //解决数据
        $api_ware_id = $this->o->getCangkuApiUrl() .'ware/program/addOutWare';
        $out_wares = api_request($api_ware_id, $temp_api_order_info);
        $temp_out_wares = json_decode($out_wares, true);
        if ($temp_out_wares['code'] != 1) {
            $msg =  (isset($temp_out_wares['msg']) && $temp_out_wares['msg']) ? $temp_out_wares['msg'] : var_export($out_wares, true);
            throw new Exception($msg);
        }
    }
    //dd("批量更新胜利".date('Y-m-d H:i:s'));

能够看到咱们挪用 $order_info = $this->read_temp_api_order_info(10);前往了一个 Generator 工具,这个工具能够应用 foreach 迭代,每一次迭代,PHP 会要求 Generator 实例较量争论并提供下一个要迭代的值。

天生器的优雅表现正在每一次产出一个值之后,天生器的外部状态城市进展;向天生器申请下一个值时,外部状态又会规复。天生器外部的状态会不断正在进展以及规复之间切换,直到到达函数界说体的末尾或遇到空的 return 语句为止。

成果以下:

1d1d8885a0b5f80bcadc08b9a3b4ff6.png

这里测试年夜量数据,间接更改$this->read_temp_api_order_info(10);就好,假如是较量争论数据表数目,那你就要改改这个办法了。本人试着更改一下吧。

40aacb258ee811a85d5b00be4ec7fa2.png

这里我次要给各人解说yield的用法,假如要看拔出数据表用了多长期,本人能够正在数据表添加拔出工夫的字段,再看看第一条数据拔出与最初一条数据拔出的时分的比照的。

更多相干php常识,请拜访php教程!

以上就是PHP天生器yield解决年夜量数据营业(代码示例)的具体内容,更多请存眷资源魔其它相干文章!

标签: php php开发教程 php开发资料 php开发自学 yield

抱歉,评论功能暂时关闭!