在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
<?php function get_one_to_three(){ for($i=1;$i<=3;$i++){ yield $i; } } $generator=get_one_to_three(); var_dump($generator); echo '<br/>'; var_dump($generator instanceof Iterator); echo '<br/>'; foreach ($generator as $value){ echo $value,'<br/>'; } 输出结果:
<?php Generator implements Iterator{ public mixed current(void)//返回当初产生的值 public mixed key(void)//返回当前产生的键 public void next(void)//生产器继续执行 public void rewind(void)//重置迭代器,如果迭代已经开始了,这里会抛出一个异常。 public mixed send(mixed $value)//向生成器中传入一个值,当前yield接收值,然后继续执行下一个yield public void throw(Exception $exception)//向生成器中抛入一个异常 public bool valid(void)//检查迭代器是否被关闭,已被关闭返回FALSE,否则返回TRUE public void __wakeup(void)//序列化回调 public mixed getReturn(void)//返回generator函数的返回值,PHP version 7+ }
处理大数据
<?php function xrange($start,$end,$step=1){ for($i=$start;$i<=$end;$i+=$step){ yield $i; } } foreach(xrange(1,10) as $num){ echo $num,'<br/>'; }
输出结果:
处理大文件
老式读取
function readLocalFile($fileName){ $handle=fopen($fileName,'r'); $lines=[]; while(!feof($handle)){ $lines[]=fgets($handle); } fclose($handle); return $lines; } yield读取方式
function readYieldFile($fileName){ $handle=fopen($fileName,'r'); while(!feof($handle)){ yield fgets($handle); } fclose($handle); }
function formatBytes($bytes) { if ($bytes < 1024) { return $bytes . 'b'; } elseif ($bytes) { return round($bytes / 1024, 2) . 'kb'; } return round($bytes / 1048576, 2) . 'mb'; } 测试 //第一种 var_dump(readLocalFile('./test.txt')); echo '<br/>',formatBytes(memory_get_peak_usage()),'<br/>'; //第二种 $lines = readYieldFile('./test.txt'); foreach ($lines as $row) { echo $row,'<br/>'; } echo formatBytes(memory_get_peak_usage()); 输出结果: 总结
|
2022-08-16
2022-11-06
2022-08-18
2022-08-15
2022-08-18
请发表评论