<?php function getLines($file) { $f = fopen($file, 'r'); try { while ($line = fgets($f)) { yield $line; } } finally { fclose($f); } } foreach (getLines("sql.txt") as $n => $line) { echo $line; //逐行输出大文件 } /*-----------------------------------------------------------------------*/ function xrange($start, $end, $step = 1) { for ($i = $start; $i <= $end; $i += $step) { yield $i; } } foreach (xrange(1, 1000) as $num) { echo $num, " "; //生成大数组 } /*-----------------------------------------------------------------------*/ function get(){ $sql = "select * from `user` limit 0,500000000"; $stat = $pdo->query($sql); while ($row = $stat->fetch()) { yield $row;//逐行读出数据库行 } } foreach (get() as $row) { var_dump($row); } /*-----------------------------------------------------------------------------*/ function middleware($handlers,$arguments = []){ //函数栈 $stack = []; $result = null; foreach ($handlers as $handler) { // 每次循环之前重置,只能保存最后一个处理程序的返回值 $result = null; $generator = call_user_func_array($handler, $arguments); if ($generator instanceof Generator) { //将协程函数入栈,为重入做准备 $stack[] = $generator; //获取协程返回参数 $yieldValue = $generator->current(); //检查是否重入函数栈 if ($yieldValue === false) { break; } } elseif ($generator !== null) { //重入协程参数 $result = $generator; } } $return = ($result !== null); //将协程函数出栈 while ($generator = array_pop($stack)) { if ($return) { $generator->send($result); } else { $generator->next(); } } } $abc = function(){ echo "this is abc start "; yield; echo "this is abc end "; }; $qwe = function (){ echo "this is qwe start "; $a = yield; echo $a." "; echo "this is qwe end "; }; $one = function (){ return 1; }; middleware([$abc,$qwe,$one]);