1、概述

生成器是 PHP 5.5 引入的新特性,但是目测很少人用到它,其实这是个非常有用的功能。

生成器和迭代器有点类似,但是与标准的PHP迭代器不同,PHP生成器不要求类实现Iterator接口,从而减轻了类的开销和负担。生成器会根据需求每次计算并产出需要迭代的值,这对应用的性能有很大的影响:试想假如标准的PHP迭代器经常在内存中执行迭代操作,这要预先计算出数据集,性能低下;如果要使用特定方式计算大量数据,如操作Excel表数据,对性能影响更甚。此时我们可以使用生成器,即时计算并产出后续值,不占用宝贵的内存空间。

2、创建生成器

生成器的创建方式很简单,因为生成器就是PHP函数,只不过要在函数中一次或多次使用yield关键字。与普通的PHP函数不同的是,生成器从不返回值,只产出值。下面是一个简单的生成器实现:

function getLaravelAcademy() {yield 'http://LaravelAcademy.org';yield 'Laravel学院';yield 'Laravel Academy';
}

很简单吧!调用此生成器函数时,PHP会返回一个属于Generator类的对象,这个对象可以使用foreach函数迭代,每次迭代,PHP会要求Generator实例计算并提供下一个要迭代的值。生成器的优雅体现在每次产出一个值之后,生成器的内部状态都会停顿;向生成器请求下一个值时,内部状态又会恢复。生成器内部的状态会一直在停顿和恢复之间切换,直到抵达函数定义体的末尾或遇到空的return语句为止。我们可以使用下面的代码调用并迭代上面定义的生成器:

foreach(getLaravelAcademy() as $yieldedValue) {echo $yieldedValue, PHP_EOL;
}

上面代码输出如下:

http://LaravelAcademy.org
Laravel学院
Laravel Academy

3、使用生成器

下面我们实现一个简单的函数用于生成一个范围内的数值,以此说明生成器是如何节省内存的。首先我们通过迭代器来实现:

function makeRange($length) {$dataSet = [];for ($i=0; $i<$length; $i++) {$dataSet[] = $i;}return $dataSet;
}$customRange = makeRange(1000000);
foreach ($customRange as $i) {echo $i . PHP_EOL;
}

此时执行会报错,提示超出单个PHP进程内存限制(要为100万个数字提供内存空间):

下面我们来改进实现方案,使用生成器实现如下:

function makeRange($length) {for ($i=0; $i<$length; $i++) {yield $i;}
}foreach (makeRange(1000000) as $i) {echo $i . PHP_EOL;
}

再次执行就可以毫无压力的打印出结果,因为生成器每次只需要为一个整数分配内存。

此外,一个常用的使用案例就是使用生成器迭代流资源(文件、音频等)。假设我们想要迭代一个大小为4GB的CSV文件,而虚拟私有服务器(VPS)只允许PHP使用1GB内存,因此不能把整个文件都加载到内存中,下面的代码展示了如何使用生成器完成这种操作:

function getRows($file) {$handle = fopen($file, 'rb');if ($handle == FALSE) {throw new Exception();}while (feof($handle) === FALSE) {yield fgetcsv($handle);}fclose($handle);
}foreach ($getRows($file) as $row) {print_r($row);
}

上述示例一次只会为CSV文件中的一行分配内存,而不会把整个4GB的CSV文件都读取到内存中。

4、总结

生成器是功能多样性和简洁性之间的折中方案,生成器只是向前进的迭代器,这意味着不能使用生成器在数据集中执行后退、快进或查找操作,只能让生成器计算并产出下一个值。迭代大型数据集或数列时最适合使用生成器,因为这样占用的系统内存最少。生成器也能完成迭代器能完成的简单任务,而且使用的代码更少。

总而言之,生成器并没有为PHP添加新功能,不过使用生成器大大简化了某些任务

以上内容希望帮助到大家,以上内容希望帮助到大家,很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货需要的可以免费分享给大家,需要请戳这里获取 或者请关注我的个人主页以及知乎专栏

PHP7进阶架构师​zhuanlan.zhihu.com

mysql 生成数列_PHP生成器的创建和使用相关推荐

  1. php mysql 随机字符串函数是,mysql生成随机字符串函数分享

    这篇文章主要介绍了mysql生成随机字符串函数分享,本文直接给出实现代码,需要的朋友可以参考下 set global log_bin_trust_function_creators = 1; DROP ...

  2. 【Groovy】自定义 Xml 生成器 BuilderSupport ( 创建 XmlNode 节点 | 管理 XmlNode 节点并将根节点转为 Xml 信息 | 完整代码示例 )

    文章目录 一.创建 XmlNode 节点 二.管理 XmlNode 节点并将根节点转为 Xml 信息 三.完整代码示例 1.自定义 Xml 生成器 MyBuilderSupport 2.Xml 节点封 ...

  3. Linux mysql生成不了随机密码,用MySQL 生成随机密码

    用MySQL 生成随机密码 晚上有朋友问起,简单的写了一个. DELIMITER $$ CREATE FUNCTION `t_girl` . `func_rand_string` ( f_num ti ...

  4. 更新MYSQL生成日历表,支持跨年份 存储过程

    更新MYSQL生成日历表,支持跨年 代码 CREATE DEFINER = 'root'@'localhost' PROCEDURE `proc_ym`(IN sdate DATE, IN edate ...

  5. php mysql刷新表格_PHP和AJAMYSQL数据库刷新表格

    好文网为大家准备了关于PHP和AJAMYSQL数据库刷新表格的文章,好文网里面收集了五十多篇关于好PHP和AJAMYSQL数据库刷新表格好文,希望可以帮助大家.更多关于PHP和AJAMYSQL数据库刷 ...

  6. 高性能MySQL读书摘要(五)创建高性能的索引

    索引优化应该是最有效的优化手段了."最优"的索引有时比一个"好的"索引性能要好两个数量级.创建一个真正的"最优"的索引经常需要重写查询,所以 ...

  7. mysql生成千万级测试数据

    mysql生成千万级测试数据 为了更好的测试MYSQL性能以及程序优化,不得不去制作海量数据来测试. 之前用存储过程的方法.生成测试数据.特别慢. 所以改为在服务端调用DB生成 1.首先创建测试表(c ...

  8. MySQL生成百万条数据超详细步骤

    本篇文章是关于MySQL生成百万条数据的全部过程,每一步都有具体的sql,并且每一步都有具体的注释,详细步骤如下: 1.创建数据库 CREATE DATABASE `test_bai` -- 创建数据 ...

  9. MYSQL 生成日期维度表

    这里写自定义目录标题 MYSQL 生成日期维度表 1.创建建维度表 2.生成维度数据函数 MYSQL 生成日期维度表 在报表统计中经常要用到日期维度进行汇总,所以需要提前生成通用的日期维度表. 1.创 ...

最新文章

  1. CICC科普栏目|颠覆认知!看完这些图,你的世界观还好吗?
  2. 《精通Python网络爬虫:核心技术、框架与项目实战》——1.3 网络爬虫的组成...
  3. 2013\National _Java_A\3.埃及分数
  4. 前端学习(2739):重读vue电商网站49之第三方库使用CDN
  5. 微信小程序快速开发上手
  6. SpringCloud工作笔记043---SpringCloud 从整体上解决跨域问题_zuul网关配置实现跨域
  7. beeline安装_hive使用beeline配置远程连接
  8. CacheCloud运维管理平台学习笔记
  9. MySQL Workbench 6.3CE 汉化及使用教程(转载)
  10. 闪耀光栅 (DMD) 的衍射效应
  11. ARM的启动过程详解(CHINAITLAB)
  12. c语言ad转换实验报告,苏州大学实验报告-实验四ad转换模块实验报告
  13. Python串口异步通信
  14. LoRa学习<二>:Rx Duty Cycle模式实验
  15. 用英语详细介绍计算机系统的组成,第二节 计算机的基本组成及工作原理(国外英语资料).doc...
  16. Google天马(PEGASUS)模型
  17. iOS开发-Tom猫
  18. 图像处理gamma修正(伽马γ校正)的原理和实现算法
  19. 系统之家 Win10_21H1 x64位 游戏专业版系统下载 2021.06
  20. 隐马尔可夫模型HMM

热门文章

  1. Apache实现一个ip(如:127.0.0.1)和多个域名(虚拟主机)绑定
  2. 运行管理员线程和用户线程小练习
  3. 男人一辈子就喜欢一种类型的女人,至死不渝从一而终!
  4. Python3高并发定时更新任务进程池和线程池的使用
  5. opencv视频模糊处理
  6. C++和服务器交互的几个文件代码
  7. php求二维矩阵的最大子矩阵,最大子矩阵-动态规划
  8. python 断点重传_性能调优-python SDK 调优
  9. 058_Unicode字符官方标准九
  10. eclipseweb开发遇到的bug