今天给大家分享一个很有用的东西。PHP中的generator(PHP5.5.0引入的功能)可以避免数组过大导致的内存溢出问题。理解:生成器的yield关键字不是返回值,它的专业术语叫做输出值,它只是生成一个值,并不会立即生成所有的结果集,所以内存永远是一个循环值应用场景:遍历文件目录读取非常大的文件(log日志等)下面详细说说用法1.遍历文件目录functionglob2foreach($path,$include_dirs=false){$path=rtrim($path,'/*');如果(is_readable($path)){$dh=opendir($path);while(($file=readdir($dh))!==false){if(substr($file,0,1)=='.')继续;$rfile="{$path}/{$file}";如果(is_dir($rfile)){$sub=glob2foreach($rfile,$include_dirs);while($sub->valid()){yield$sub->current();$子->下一个();}if($include_dirs)yield$rfile;}else{yield$rfile;}}closedir($dh);}}//调用$glob=glob2foreach('D:/phpStudy/PHPTutorial/WWW');//用来查看文件总数$count=0;while($glob->valid()){$filename=$glob->current();回声$文件名;回声“
”;$计数++;//指向下一个,不少于$glob->next();}回声$计数;结果如下2.读取一个非常大的文件functionread_file($path){if($handle=fopen($path,'r')){while(!feof($handle)){yieldtrim(fgets($句柄));}fclose($handle);}}//call$glob=read_file('D:/phpStudy/PHPTutorial/WWW/log.txt');while($glob->valid()){//当前行文本$line=$glob->current();//逐行处理数据echo$line;回声“
”;//指向下一个,不少于$glob->next();}结果如下log.txt这个文件有12M觉得还不错的请点个赞!
