分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 软件开发

简单了解一下php的迭代生成器yield

发布时间:2023-09-06 02:02责任编辑:郭大石关键词:暂无标签

yield是从PHP5.5开始有的,关于yidle的说明鸟哥的博客做了详细说明,我觉得是有点复杂,在看了几篇其他的帖子还有案例,我大概知道yield的作用就是在做大量数据循环处理的时候,能节省很大一部分内存~

官方:http://php.net/manual/zh/language.generators.syntax.php

鸟哥:http://www.laruence.com/2015/05/28/3038.html

参考案例说明yield的作用

<?php //普通模式的代码function generateData($max){ $arr = []; for ($i = 0; $i <= $max; $i++) { $arr[] = $i; }} echo ‘开始前内存占用:‘ . memory_get_usage() . PHP_EOL;$data = generateData(100000);echo ‘生成完数组后内存占用:‘ . memory_get_usage() . PHP_EOL;unset($data);echo ‘释放后的内存占用:‘ . memory_get_usage() . PHP_EOL;
# php yield.php 开始前内存占用:387600生成完数组后内存占用:387632释放后的内存占用:387632

前后使用的内存差值为:387632-387600 = 32

# php yield.php 开始前内存占用:386912生成完数组后内存占用:387520释放后的内存占用:386944

前后使用的内存差值为:387520-386912 = 608

明显608要远远大于32,不是说是降低内存使用率么。那么就把循环的数值调大试试。把100000改为10000000

再使用cli模式执行,发现不适用yield会报错了

PHP Fatal error: ?Allowed memory size of 134217728 bytes exhausted (tried to allocate 134217736 bytes) in /data/wwwroot/default/up_sql.php on line 7

但是yield依然是608,这是因为它自身,它在你进行迭代的时候才会产生真实数据。

所以如果你的数据来源非常大,那么用 yield 吧。如果数据来源很小,当然选择一次载入内存。

简单了解一下php的迭代生成器yield

原文地址:https://www.cnblogs.com/wt645631686/p/9269836.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved