mysql 生成数列_PHP生成器的创建和使用
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生成器的创建和使用相关推荐
- php mysql 随机字符串函数是,mysql生成随机字符串函数分享
这篇文章主要介绍了mysql生成随机字符串函数分享,本文直接给出实现代码,需要的朋友可以参考下 set global log_bin_trust_function_creators = 1; DROP ...
- 【Groovy】自定义 Xml 生成器 BuilderSupport ( 创建 XmlNode 节点 | 管理 XmlNode 节点并将根节点转为 Xml 信息 | 完整代码示例 )
文章目录 一.创建 XmlNode 节点 二.管理 XmlNode 节点并将根节点转为 Xml 信息 三.完整代码示例 1.自定义 Xml 生成器 MyBuilderSupport 2.Xml 节点封 ...
- Linux mysql生成不了随机密码,用MySQL 生成随机密码
用MySQL 生成随机密码 晚上有朋友问起,简单的写了一个. DELIMITER $$ CREATE FUNCTION `t_girl` . `func_rand_string` ( f_num ti ...
- 更新MYSQL生成日历表,支持跨年份 存储过程
更新MYSQL生成日历表,支持跨年 代码 CREATE DEFINER = 'root'@'localhost' PROCEDURE `proc_ym`(IN sdate DATE, IN edate ...
- php mysql刷新表格_PHP和AJAMYSQL数据库刷新表格
好文网为大家准备了关于PHP和AJAMYSQL数据库刷新表格的文章,好文网里面收集了五十多篇关于好PHP和AJAMYSQL数据库刷新表格好文,希望可以帮助大家.更多关于PHP和AJAMYSQL数据库刷 ...
- 高性能MySQL读书摘要(五)创建高性能的索引
索引优化应该是最有效的优化手段了."最优"的索引有时比一个"好的"索引性能要好两个数量级.创建一个真正的"最优"的索引经常需要重写查询,所以 ...
- mysql生成千万级测试数据
mysql生成千万级测试数据 为了更好的测试MYSQL性能以及程序优化,不得不去制作海量数据来测试. 之前用存储过程的方法.生成测试数据.特别慢. 所以改为在服务端调用DB生成 1.首先创建测试表(c ...
- MySQL生成百万条数据超详细步骤
本篇文章是关于MySQL生成百万条数据的全部过程,每一步都有具体的sql,并且每一步都有具体的注释,详细步骤如下: 1.创建数据库 CREATE DATABASE `test_bai` -- 创建数据 ...
- MYSQL 生成日期维度表
这里写自定义目录标题 MYSQL 生成日期维度表 1.创建建维度表 2.生成维度数据函数 MYSQL 生成日期维度表 在报表统计中经常要用到日期维度进行汇总,所以需要提前生成通用的日期维度表. 1.创 ...
最新文章
- CICC科普栏目|颠覆认知!看完这些图,你的世界观还好吗?
- 《精通Python网络爬虫:核心技术、框架与项目实战》——1.3 网络爬虫的组成...
- 2013\National _Java_A\3.埃及分数
- 前端学习(2739):重读vue电商网站49之第三方库使用CDN
- 微信小程序快速开发上手
- SpringCloud工作笔记043---SpringCloud 从整体上解决跨域问题_zuul网关配置实现跨域
- beeline安装_hive使用beeline配置远程连接
- CacheCloud运维管理平台学习笔记
- MySQL Workbench 6.3CE 汉化及使用教程(转载)
- 闪耀光栅 (DMD) 的衍射效应
- ARM的启动过程详解(CHINAITLAB)
- c语言ad转换实验报告,苏州大学实验报告-实验四ad转换模块实验报告
- Python串口异步通信
- LoRa学习<二>:Rx Duty Cycle模式实验
- 用英语详细介绍计算机系统的组成,第二节 计算机的基本组成及工作原理(国外英语资料).doc...
- Google天马(PEGASUS)模型
- iOS开发-Tom猫
- 图像处理gamma修正(伽马γ校正)的原理和实现算法
- 系统之家 Win10_21H1 x64位 游戏专业版系统下载 2021.06
- 隐马尔可夫模型HMM