php yield 个人小解_php 新特性之yield大数组处理优化
场景: 处理大数组的时候,比如循环更新数据或者导出订单数据到excel文件,普通方式可能会引起"Allowed memory size of XXXXX bytes exhausted" 错误,而yield方式可以节省很多内存,就不会有这个问题啦!!!
代码环境: MacOs / php7.1.3 / 8G ram
/**
* Created by PhpStorm.
* User: lf
* Date: 2017/3/30
* Time: 15:55
*/
$t1 = microtime(true);
//common 方式
class common_data
{
function data()
{
$array = [];
for ($i = 1; $i <= 1000000; $i++) {
$array[] = 'item_' . $i;
}
return $array;
}
function callback($param)
{
// echo $param;
return $param;
}
}
//yield 方式
class yield_data
{
function data()
{
for ($i = 1; $i <= 1000000; $i++) {
$array = 'item_' . $i;
yield $array;
}
}
function callback($param)
{
// echo $param;
return $param;
}
}
//$commn = new common_data();
//$data= $commn->data();
//foreach ($data as $value) {
// $commn->callback($value);
//}
$yield = new yield_data();
$data = $yield->data();
foreach ($data as $value) {
$yield->callback($value);
}
$t2 = microtime(true);
echo '耗时' . round($t2 - $t1, 7) . '秒
';
echo '内存: ' . memory_get_usage() / 1024 . 'K
';
结果:
yield 方式 :
耗时0.184339秒
内存: 349.984375K
common 方式:
耗时0.1598852秒
内存: 72183.375K 72MB!!!!
可见两者之间的内存占用差距是相当的大啊!!
同时,yield方式相对会耗时一丢丢,但差距不是很大.不知道在低版本的php里运行会是什么结果,大家可以拿代码去进行测试.🙃