生成器的核心是一个yield关键字,一个生成器函数看起来像一个普通的函数,不同的是。普通函数返回一个值,而一个生成器可以yield生成许多它所需要的值。生成器函数被调用时,返回的是一个可以被遍历的对象。
yield和return有点类似,不过不同的是,return会返回值并且终止代码的执行,而yield会返回一个值给循环调用此生成器的代码并且只是暂停执行生成器函数。

<?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/>';
}
输出结果:
aaarticlea/png;base64,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" alt="" />
调用get_one_to_three()的时候,里面的代码并没有真正的执行,而是返回了一个生产期对象$generator=Generator Object(),$genetator instanceof Iterator说明Generator实现了Iterator接口,可以用foreach进行遍历,每次遍历都会隐式调用current()、next()、key()、valid()等方法。(Generator类中的方法)
<?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+
}
处理大数据
​下面通过实现一个xrange函数来简单说明:
<?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/>';
}
输出结果:
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAADUAAADWCAYAAABxNspcAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAPwSURBVHhe7ZxbkuowDETZYZaVpWQpLIVl5MYPwPGjRvZlSLenT5U/Bn44JVtIipnbPiGSYkFSLEiKhX6px7Yvt3W/xz8R6ZC67+vttt/8mkHqvr5EHtsyiVSCpC5CUg5JXYSkHJK6CEmxICkWJMWCpFiQFAtGqce+Lc/5RFwrbk1hkvKl0UkiDmGW7dDFY3z7+WHMsm+AVpJKQa7Wx6R8lHCTRbdUiBBuknB0SCVjZ+B07jBKPYUwE0OOSeq+OiHsFj7FIBWitDCEKGKWepVH+QI8Xx2JggdJsSApFiTFgqRYMEu9Wo64kMsmm9TRFJ4kYpOIKja4/eLIbJbONzChFPojUrNUaBTjmqOdz5gzUWBvwWGpEC1NaL+GQcql7+zDz3Gm8uEL9vxv/EwBIykWJMWCpFiQFAtDUs8hDGpb1S/lfz8VyqVppHwHvCxebA4pX50fFXuM1gRSybPfOaSykdgMUkWXSy9Vm0VwS1VuZBYLrwvuSBQJ82S/BEl9nzEpcCTFgqRYkBQLkmLBKNW4RwtaUtikwMuinL8uxfHrAYdNCvhJfI0OKY4k4bBJ5TwlqbNfhTBhwtySw1LI58wk9XiUn5w+Uk7gdHzimaK/RXa673cs5C/i8TMFjKRYkBQLkmJBUiz0ScW2/l1ZkN9LR7+6k2KTmnHw4qME/E81cgxS2L+VqmGQel/fObcfuNMls1SeJJATh12q+PSt16/HfKbK1h33rBmkYis/V6QO4vdUGq2QNOjnfu+EERZmieTokOJBUixIigVJsSApFn6Wqj3EThbiM6rhSIV+inyadCbUgfRPElOQo+QYkMKOkqNbCj1Kjk4p/Cg5+qSAL4SkdEmFH1niT2o7pDi2nsMuFSsLwOFRgVmKIes96UsUJEiKBUmxICkWJMWCXSofwADXSzap4nZzfFYFKmaSqrYcXpR4mjSlVPnMd5oRWTxHcSH3VSap0Euls4l4hwK0tTdItbYa7hb8Wap514/5xkvlYkiAOVIH5e2WGCXqlH4QkkXIfH4Bz//MUkxIigVJsSApFiTFgl0qG7ygNogOk1TZT8WGkXfw0qjGfeRYr3A3+6kgixgss1QRqWafdT2mM9Xup4ilHEHsvdY7eedbpXnWrmdcin5CW4A7SXKYpB7bevo+CucL96KIMVLvbOcX+KWr8TMFjKRYkBQLkmJBUiz0S/nqvF0ilS1KfOOLdEjFYYtfdam8JiwHNt/BJpW0Gc1bz9X+6ppqvnv7taRar19R0X9Myn/4SvV+xRb8damwdSX132j7OVpSva//Jh+TCttsspT+EkjeuyJKjg9KObIBzQVCjm4pBiTFgqRYmFBq3/8BAvkGUGcBBTkAAAAASUVORK5CYII=" alt="" />
上面这个xrange()函数提供了和PHP的内建函数range()一样的功能,但是不同的是range()函数返回的是一个包含值从1到10的数组,而xrange()函数返回的是依次输出的这些值得一个迭代器,而不会真正以数组形式返回。
这种方法的优点是显而易见的,它可以让你在处理大数据集合的时候不用一次性的加载到内存中,甚至你可以处理无限大的数据流。
处理大文件
​来优化下读取大文件,在PHP读取大文件的时候,经常会出现内存不足的情况,如果文件过大的话,没法一次读取完,采用yield来实现大文件的读取。
老式读取
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());

输出结果:

aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABZAAAADjCAYAAAAbpzGVAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAC06SURBVHhe7d2Ncas6FgDgdOiyXMIrwQ1sDy4lZXgBSRikI4x/cuMk3zfD7AsGIR0d5NyzDPm4AAAAAABAQAEZAAAAAICQAjLPOR8vHx8fl+M5//wXfXUMPk+Xw9D+4fSZd/By8nh2Pn5Msfj4OFzuSjkx/B6/fX1oxvd5OR2G/Dychv9KUs4eL1LvH/rt97v17FewNvBTyFW+le88fgp1kW/3wwrI58uxSpjP02Fa8Mq2/Gz6Ml78I3OP9AW+VThJfSjXWy606dz4s1U/33x1vitu/+wLp537SV5E5tiWX76mfu0tgF0LEqcHcubLY7Brobx3DP08LsY8qK+5zPHt/ny3Tr70fHce5+vPW5m/u/I4z+lxyIExFx4YTFqn7iwcF0/EcL7uac94c67nWF1juc7p9WeD1Vrx3v9Iu2sN/oe/SNX9Wq4H1y3HNvdrXz5srF/N+F5VQH7Vmlnn3bofvvufVa+Z7X2+iu1da+ZGDvyz8d2Sx7t3Xc/9Tlvnnihr4aKt5b38L9aSh921rpRx/YP1vupX/W+TtF3z8qF77XTf2P+9O9fUTq7uil3e/9a5mu/dvX38Z7la96usB9U2f37XmnrnerXH7nv+Vd/pyTLPlvH4rfmX5vlfrC8/LP++yl3res7tZWxW62e7TcesYvsv1pbHpXV/Zx/zuHbn9hOaftX5ulpn8jztzLvU9pDbu/7t+2p33CvB2vCjCsjTor3offklY97VJNR9E5kCdCt5U8DrJusv/jkpqmSox/B+rl/A/zSPb4ji1sx/pbnpN5T2p/+9d+zBjfVSOxfK+8YQ5/GoxHXc4mumHPkXC/fD/uGXyz2iPJ72bXxx7M/jMi/n+9a9hYfyv3jmPihr7/S/t75E4/wb+77aV77k6w7tWue/03uuwW3ccj+3JnzXfCbl3ngkB9M9dP+c3nfNaM0cYxDEJOhLudb7es+8a+KW7+utUL7ku3/K3S/8Xt8tzcvudf3m+lZyNGqrXOudMqDyNvOy1Mbt9pqS52HPQKacH9bR8+3c/27d+ynSydVd5wYxfzs/5ffQHd/T//L30MYd9/xd+TeMJv53UC6s7Lh/5d/9flz+fZW71vX9+RbGqrPWvpMpL96tj2WO5rAPa8NqXYjWirRv131X5mXHPfB6d94rVQ79nAJyM4lp4PWApxtnOZHNeX3NuaHgCycv0uuuxP1rFs63k/t9Mw7/UDSHYcxr+xfcMi/7cqAy3VS3+vKEPNZb47hvDEEer+K1tQDuj+u32RmzfyrK411fGnvjfT3u0XVmOu/Re/+Z+6B8MUUxauzPv5/5i1Qa31utwWHMcz9vTPjeXHxmDZ7OfWBO77tmtGYGOvf03jh8nzfMu2g9yGv7dij3rxHdHHhmPXup61h25dCt9S3n5yG8d/fH7du8zbwsBDGf5urWvbTr+24wH7dzDfpGd62pnVzdFbufkKt5rXqrPkY5l9eE7W7ujfed69Ued9zzd+Vf5ztd/n2hn5h/X+WudX3v+Dv/du+ste9kmq836+OeHJrWmrrfe+Ndjovuiy93770y5ta1j00BOQVinMS0rZMwXWxcWM/luLzIzhOfF/pl4Lba7CZMbqeMpx1c7ks14PZLY+9NF50baW/0MHkG0dj2TdJXS2OY5+Qa5Ou+spV4zPNxPXc6rZqnIRjzF1Yaf9mCOR6sjxkSM/8/cU2OVDHbN1f7jyvXmI6vrjV8uo5XPZZFDJrxRBeu4lxfronbzl8CtsdQa/N4LX0eX3P/PfW14jxexy9tpa/psyGm8xzkuXwqj/NatDymbm9Q5mcp2hfZl8fXeRnbbeen7uciP/N4r58N2/J69edDn+dY5kOGHdNnx3MQj3xI13TucNx0nVvH78+/KW51e+Va+cfvUcWoWmdXW/VZswY360Nuezyvai9KtXV+x2twHLOd87Az3uVeaNavrfHlPU0uDv+1ilFH95qhW2tmNo23XfvLtb5XvGamPi/2j9utvJv3jwcNFvO0zqlo7qv8H4+p2xuEMZuu0/luXdi3Zl6v0eRA05+d91UvDlU803Z7HOW6pb3n7reSw3ksdWwX1/pWYXzrnAk+G2Lc/bfJeNhonteqvShX8lzOxwwXa9rrxKzk1bad8Z5zfpy/KGeq+3rYmjbncZeYlC3OwfUxw3gXeb2ljHvXmtrJ1ZfG7svFa+o6fmkrfU2fDeOe8zzFYN4/HTW4J1dzPOZjFu0vQxnGtjMPtX1r6nVexmut5mfuT/VdMpjazvuuOVmPKW1bqVHGtyv/8tytD4v2RX5f/l3nZzpsnJT4uyzMlffPv5Rj7Xo39am0G/Q5SXE+/PdfsA7mOaj6tmo3cnNdX9qXb2mMQSx3xvirhfd5/T07bbmvcw7mp2Sn/x5Oar6Pcv6N8c5zWLZ2LgfVMXP7y/ma5yf/3BHHfOc6UuZluta1jXS/VdcucTr+r+1rds3x+n5cbHOn+vdKbD2mdQF5GMiqgRzgawAWHaqikgY7bPWAbrXZXCNZ33idiajPzcGtj5sCGgS6tu+4ti+9ReI6kXnHYDq2GcidxnHvGE8s9X89J6dFHxc3Yd4zybFuErozB+s5Tddct1lyaXnT5eOG7dq/aO7zuXviuHMB6BuvtexjEJ85Nst+RuMbDx33VTlxKm3tjckrRHFdSp/H10z9fLY/YywebyPo3zKPcx7W7af4D1snv+d47M7jYN/Guet4b8W48pI8Xvezuz51YrPsZzp3HOMiV6M1osSin2gP2J9//fGs78u7jW3U7e6W52IZkyFOw+8vWTtXkyi+oxzjazzy+VXc27WnHHd7vZnObeZwb/5GuX+H3vgW8UljK+Mo43rmfonsGUc/JnEM7/RU3gV9+5bv/mDfxrlNyKbr7pjbqc0ncqAeX4nP2M9Fp5r7KhrLHMNh6+bti0zXitucrjddP4+lCW7af/ue3pLaaJreK5jf6+9Ig2ZeRvHcjJoYz3MRzNny3HzcMhbh916YZ734tvb9u2ND7vtqzjbGM27X3SVuy3yJ9uV7tr7Os6Y+1bm6N3bpuGf7M+bH423cWFOjuRmknBy2at4fztUyPw+uqSmv63kITG3WuX6HaDyD9vrD3F5/IZrPu5kSdwviMV1rzxh/X/41cd7IofW5PyP/0nXa86d4zH3PY6k7OedFsD7NY61y+AX5cbWnvSAfiqn/O2K8ZRrn423cus+b9W8U5tEg77+ONc/LeOziwNRmtN6s24vuiem4+h6p5X7U6TKa2ow+2KW+p/L48s9xLudjOtcM43uX9f174xUWdWfKBLUdiCYpVrcZ3azVTTBNUKftRXJ1r7/zxtmVLFUAR9PYo/OCL6IooVLs+lt1+CDHrPv5hvoLorFO0lk+r1mY6vbKfFQXaJK914/6OuHcX/NjHbto/tv5etrUx3YsTWwW/Uw/dsZc7I3JS9yKS9X3lZQj9Wd353EeV9ruXNRuxTLnYdzHIE/q9nbmcbyIl/11e9Vx+Rr7nth9Lo/jfrZzPMVnde931oOyf9nXTp6mmN85v5vi/KuVOWiOm/q57k85tre110qxK5/fNS+d3LzqxLwT37a9YG5G9XG9e6i5Ti/e6xikLZrnffPV1RvfIj7LHOve40/r3IO5f2n8/etO/apOTn3tb21ePZF3vfme3Zl3dXslDtUF6rUnXovK/rq9IJ75uqstHFRnvvZq4rXzvgrjUM6txnNzTh4wtdnehym+ZX/uT3PhtH8919F9vtx618qfN98d225+X4Qx68zNoGkvn1/n8/q43N7u7736uuW45dZZGzrztU+vn8Mn9X3WGffwwTS/8/4wvoPu+U94KnbpuHge+1tvXGm7cx56sSrqtSFLfWzH9FiuBnOd7V1TV/dr3uJ5fs2aum67n8OzW3F+WDueFIshtmUdL1tz8d+Xf0174XdZidH1/J+Sf71+TvFY5F9zHw6Wx9SfT+0eDlOsbo31cXG+LaXxdXJomtvqszrH6637/Ze2rb60bt/nUdznPtaTnvdf+1D6Fp9/PS7/PtMkUd5f50GUbDvv2ZQX/fHetLwfp/9e5FMzrkHeF3V51dbD1vffRgE5B3Pc5gD0EyCc+EbUZg7y8tw60eufs/aancSYgnrrRr59cybrAI6mfkRJUk/4oJuQj8pJMW172s0J1p+rzhz3kq/eHyX1qIpFN1/q86fz6uOuebTsT8qjuo9753Wfco3VdXqxKbHMH2wu7oPdMXmJNo/X0ufxNV8b01EaezunXbfyuBOzbowfyuPOvTKq24vyeB5DsEY069UzMe/1c52fo+nay+M2cq+JZec+uJX397sdizmfomSK5uIZedzd6zXK+lXPcdGZr0582znqzff6nu7eC017t9aKooyrbXO61q7YBHaMr4zlFH4HvMqeOOS+vToGkXvzbl5verl/Z97V+3trxXTci9bMSD6vjUG6VtOfver+dPu+vq96cZjmvz43H9t0/RlR3Jrr5LG8OmaNfJ3h2v31bm3+HasXlGZeRr25yXFfxiM8v1w3H9fL5UHd3nRelM8rJQ5BDKZr7YtNY6Of5bN5nJ1xz33LHzTxKrau9agoVxu92KX9r+xPGnva2jgFcky6Y+jErBfjh3K1xOeFa2q5B9vYPhnzznhK3Lvtds57XvudPq8/q3jm321W+35f/jVx7t3z03Ff953+VfmX2m3X2ikey/43+VblyWr86fzyCoS5bzvHut+tsVe/h9Re3Z859zpzH7h1n4d52cvBZn8vD6u4NHNb1OfvzbVobcheEPOUm8fLMehLnbdTfodzkfvYDvpO65isCsjzwjlt46DjgEYdDCd+cLvNQU6EMrapreVAo0mozplF+6d9W7+g5T7tCm61kAzqSSyixaoZ28vkBNmTrPkGSlsdl84c9266en9zU2fVcb2YNedHc1/G2nYm2J/Gc3sR6ClxTdvUTj3mXmyqWHbHnO2OyUu0ebyWPo+v+WxMN+RY7rpHyrHTVuVxJ2ZTjKN7pJ7DXXm8sW7U7U0/x2tYc41w/zMxz/0c2gy3Rc41OZj7Eg9xPH8xpnrMWe+XtsdtxCL3d+xHN1bRXLxEWSt2tL3oZxuzPF/1WtCJb5svnfNL/3ID+9ebW2vFQnNuMl1rVwOBHeNLuZi3R69z0944xGvnUzHYdEfe5RxK23d89+drRHGo25t+3nefxmtMulbTn72ace+7rzbvgfrcfGwUjoc1cYvysTcPT8ZsQ/m3wJ62V/fzrnzszU1paxGP8PzSv5xDG/NStzedF1y3VeVJMV3rwe/Hrfyp87Az7uHAVezCPB3V7b1Ck6s9Uey+LldLrMJ1qlaOnbZqHjsxa3IyeyhXy/xFfa3P3x3vXh+fjHlnPPMYphgGY+me96yUV8t24++SaP/vy78mzr17fnXcz8m/3txO11qtedV3ZtPv5efjf6c2l98FU5t75m+3G2Of+tiObXZH7O9T7t2Na8/KsXmr4hPOeS8Hm/257ea7q/ru6MapPv9GvJdyX5rpfkXMc9vhd/JqLP3+prjumZ89rte5FpDDSYoDGg1k/8RHbeR9U/TbBT2chG4SVDf+aOrHreBdg7Kt7V9alNokifZHi0qKXX9rknIhXSMfu3VgpCTm6hqdOZ7i3btBFvvDOR9Ux4X5MqrPj+a+O1fLPCr2zmss7Gc95l5sqv50x5ztjslLBPfZSnAfzeKYPp7HOU43j+uI8rgTs26MH8rj3O/uwr5ob/q5vm5vDqLYP5PH6zzcMsVnOZ6N3Gti2bkPer+0Pa4TizkP+vfYJJiL1ToabFtxf2oNznO9vkYnrzrxbeeol5f5WrmB/etNL08jUe7ma90dm2zH+Oax5Bg9fK1Ne+MQ329RDFK/+9vWtX7md38vNwd1e9PPN+7lYjq2XmPStZr+7FX3p9v39X3Vi8M01/W5+djrNV6gituttW3c6ntr3fc8vu62NUfLc+//Drj2fXGNZl5G/bya14b8c3x+uVbuYy+XB3V703lRPjdyH9sLD9d68Ptxo5/ls/lynXHX/WriVWxd61FVrvZFsYtytfS/v7XjL/I1bh7XkeOzOrcTs16MH8rV0u8Xr6npGvWxccx36+bg1Tx/y/HsOO8xwXd6L0bT/uV9+vvyr4lz755fHfdz8m9931xN8aj6v1zXp8+rCZn3jTEq507xGvuc+lmd8qTtsUdjWIliv8iZcLvZ3o7jOlIOrs9N++I+NuNu9vfysPr9rM7JWX3+PbmWrtEce0e+98xxitpfXneKR/B7RB7vvnHcso7JtYAcBjUHvgpolCzhxO9qM5kXiyjgUWDCtgc5qVb7ozYDywWjL/W/bb/uS45V1cEpTk2n75VjmLfnmlsk4KQzx7141/t7N3t1XG8hT/sX53duijiOOS6r/cF87RbHovRxbjOPrRlznYu9GGa7Y/ISt+JS58XSehF5WI5H2p5bZJv+dvIwXKdGD+Zxr720v26vnttOHMNrP5PHY5NjDt2O8dTvVb6n63bvtWWbnfzu5fXjorh11q3I1M/X5FvK3cfnJcl9vyZLPJZOfNt86cViPZf715so3oPP8U9xVcLc7Zy/147xLe/Dr1kvR3vvwXRcff2pj88lyuCVeVf38868q/eHcz+ojntuzRx2D3lXi3N573x1NOPed1/14tCurYN87MN9jEz9vrW+5bE0F37yXs3KPThtTbzuNI1nMbfNvIx6c5Pjfvf3VDWns3L/1e1V8Y7Wxl6bu+arpz/uNJ523M3cVjkY30tl//O5sfJU7F6TqyUuaXt0HorUz7lPW2tBcK3HcvVWe4vzwzV1iHcQwrjNNL66P7t1xlPr5e7D1+0KxhPGqI35GLffln9NnDvn18f9rPxrrx+uoXNfx2t28mE45zz+79yh3L9TnEPP2cq3at4j09ifza8cq+Fa47Z5vR3q+zyc814ONvs785hjM8/RjfaW50/92ZNs+dz60JIj1ZX2W+Rru/4kUx9LHjbX6sXkUev7b/EKiyrI5cKrgPY7s3Wzb7dZjMceLofh8zYp151OSlvLa+brVW3vncR9x+3rS31jFLsTcsuYVDvGExrOXV0+SPxwLqdEbm+QZn/v5mzOz3O1vE65gVfnR/EeBNdJ/a5usOm4xxfy5qbN41iNZd63vE6UiyVP1v25/oXxvTF5hU5cZ+nz+JppHM/2Z5yvh9sYYr7qe45Tk1/VAON1avBoHpf5Wc5zlCO9eNftzTlS9fHJPC7Xb/OxysUxPtXaku6BdSxSHKt+NmNJmnvoaUH+NfO/YepnkAP3GNt4dA0e+npcBaO918I87cS3jP16fs6hpn/1PZF/Xl6n5POqvdyfdmIvh9W+KMdGaf+uuYnsGF8dr5KfD18zFIxjmJNVHpa+BfkVxvBez+TdcO7q8jmuy3135V29v5mnrHPcahz5mPV14rwZ15PVvnxuc93pOk+sO824d95XnThMsa3PDebgaVO/2/xby2NpLpz2N7G8S2rj0TGdj+u+N79Lh/HtzU2O+/L8Zl6T+ntq9/demGdDTqz6kvsXzMt0naDfu0X5H8UoH3f799RgX26vuc6zwlzdG7tX5OrYhSfaGPq/yqPmfq7WhixcZweP5uo8P8u4zfPd9qdu73xc52/J/fq4dJ061+8QjmeYx+M6/6c4BPn30tyb9OJRzUOJ7+rA35d/Y3ur+enFvXPc2+dficein+Vaq75P8vwO/0ZqPxvkvow1q2U/p/nsnfOUjXwL76vKdEww5/eYxvxoG7fv82ZdG/VysNmf4tPGvb0HUv4v45XPHY+r+1O1N+5bx7nNqWK6zuakbKn73blOJw9HYTyfkvpQrrP+I3qLGz4Ft56Q3gTlQG0sSP02r1Ib8WB7E1ESYd6aY9L19izQUbK01gG8WiTgtMU32XMJ9Rp1zNru5EQdtxKP3gJV7+/d7OH5i+uM23it4Px+zKrzg5jvm9Mt1byObdVjmX8OxpMPWdqO/76YPC9dJwzrJH0eX3P/PfWVbuZxnpdxK31N5/TXqbmNe/I4H1uuNeVqcFw3j+vzg7x5Po9H9f3SrrVTH3vXX5ybhjj+9yKWUWwGr/8SC/KvjmG1rY6d+hmvz/9KHc/2XlrMVZmPTnzL2K9t5DWrmcfc5qqBKifGc6Lc78Us92neovx+Nt47xhfd12lfp08PSbGK8ztfa+N63fv/H5pjkre2O3fkXb0/yptRdH59v44fBsf1YnZ7HHlemnvgDk1/dt5XnThMfa7PzcdG/X/Y1O9b91seS3PhYG3956o1KRjL8p5LQ+jNTY77so0oHwfR91R9b4/nNO31YlbneJiLL4p3fa1ha6Z2Hnew5udDroI56OT1U3q5+i9j96Sba1GO+7iVvrY5lDyTq03MUrI250/XaDqZ75/5/Pj3tdevqdmO+W7v+VdIeR61V9/7bZ79vvxr5qd3z0fz+BPyb1T1cxzb1KeNnIvnuPS5imMe8+vzop9vqZ/BfC5N/bpxzFe7eZ8v8yD3tZeDzf58btNm9ftZtr5vxnwLzp+u0eZifc/Fc91fW267J7c6x9axXm4P30PrMa0LyN+sdxNPHk3+TgJE9i1OzyRFHuOjJ/8FOelXIXp44Us3Vnxz/3XPL27iumHK2Wrd+WV5vLlef6kn4/HwPPwR0Rr8xHrx+u+8/AvTS9vcw3f/l/oDa+Y/8dT65rv9luh77+HCxh3/PnnalBePr1/le+GluSFXv5Y19Qb/DvpS8u+Fnhz/U2vtX5Diu/4d/YmY/7N4R/3+KuN6eb2f36iAfHshf+QfYHeds2vC/SPyK/X+n7SH4mbB3OAXp68U/SNz9HvyOOXP9+SAX6S+Uvdphkfi9iUFku/KPd/9X+n3r5n/yFNj992+rbf2PBa3f7omTHnx+PqlgPzzWFNv8e+gryT/Xsm/e75U+ODM4KF/w/zDteFL/o3VUeXQ2xSQewvN2n3/cJzavPOGSedsTUbqQ3kUfO8amP5Rns977NvqlxnjWM3NlJy9+b1v7ktbQt3zWB6n+yNt/2RxfHfj4l2tW+Vej2P68/J4HM+6v+nL8ft+GSnXvzMP8y8I6Ty/SKVcvGcNzvf/ze/pLMf71etEur/+0S9MK4+tmb77K39gzfxWefxp27/O+W5fu/t7L693e/PukX+fPOXZ++Ir1nO5+hrW1Ac99p0u/yry7x/w755XGe/fdS7ldaDzb5uUy3tjl+dp77+TnpKv9S9ujOAe/PYCcllkJPYftFrY0va3vyD4kVb/CBq37yhufa3lL8zT9k++HPlyP2YNXv7y/Pvurz/nD6yZ/Hy/6nvv2SJM/q5QMHtT1lS+k/zjx1gX46fthxWf5t9NvvF3krd6BzIAAAAAAO9DARkAAAAAgJACMgAAAAAAIQVkAAAAAABCv7SAvOOvIPqDEAAAAAAAm5oC8ufpsPrLhHGBtf4Lhht/bbP+y5y3/mJg/Vfho+Nv/rVPBWQAAAAAgGetC8jn47qgmgu16yJrKR4fL+eyZyo6t0Xk8zEq7m5oirrny3EsEB/LlUbjvnWbpeh9PUwBGQAAAADgWTdeYZELscsCbi68rmq6+bi2+HxH8XgwFZzrou+udup+KiADAAAAADzrywrIUzF4fdAN6WnjpqC7q9C7o4Cc25mL0Yt269d23NVtAAAAAIBfarOAnAqr11dVFOnVFPUrLJbHdYrBW8LC9Ch6jUWtvl5dQM5tLPs4F5TX/bz7tRsAAAAAAL9UU0BOBdS8bRRtV0/t1q+KmIvBuZBbjguK0bNuAbl+urhWrrEs+i4LyOXz6tqlgNy0e+t6AAAAAAB/w/YrLMI/ohc8EZyPm3fNT/eun+TdfLr3oQJyebK4Pu9aQD71rpmvFz0lPfWzLooDAAAAAPwxN96BPNZZ16+n6L3WYrW/V5zdKNqWz9o6cfwKi+sT0FFBujx1nLat63ULyFtPSwMAAAAA/AE3C8jp6eJrkbb7dO7quFT07RWDw4Ju97N2/1w8Dp9KHl2fQD7nY5t2PYEMAAAAALDp7ieQe0/nro9LBdx7irblnKZwWxWwt9so1m2lPlcF7dxOW4TeKnIDAAAAAPwdiwLyWHStCsPRO5Cjwmt0XN53PSwXdZti9KI43LTTe/q4LWCv1cXocu22EH2rjwAAAAAAf1X1BHIq2I5F1bQtCq4r9XHR6yoGiyLttFVPFzcF5FEuIpetfhL4+u7jaCtt1QXkUSkO5zbnJ5nP8/60KR4DAAAAAIxuvwMZAAAAAIA/SQEZAAAAAICQAjIAAAAAACEFZAAAAAAAQgrIAAAAAACEFJABAAAAAAgpIAMAAAAAEFJABgAAAAAgdGcB+fNyOnxcPg6n4b++xvk4tP9xvJzzzwAAAAAAfA8FZAAAAAAAQgrIAAAAAACEFJABAAAAAAg1BeTP0+Hy8TEWcdN2OC1LxYsC8ufpclgc93GMSr75+HJMXXiu2hivpYAMAAAAAPAe1gXk83FdMB5+Hgu719rwoiC8LAbn41bnluLwsrA87DuVH4NzrsVrBWQAAAAAgO924xUWuWA8F4FLAbkt8Kbib9m/eFJ5+rnW+7zfPgAAAAAA/9ZGAfl8OU5PAy8LvRuF4emJ4sMlPVCczl2//mIhP50cfe4VFgAAAAAA72FVQF6//3gs4tYF41sF5Py6i1wgDl+LPNr4XAEZAAAAAOA9XAvI4VPB9xaQ8xPIG08YTzyBDAAAAADw9q4F5OUTxLP8Gou6gBwUeKfC755C8yS32zyCXF6boYAMAAAAAPDdFq+wqIu6pVi8LAQv9i2Kv+XVF6t6cC5Ir4rEn6fLKf9Yzlk+hZyePh43BWQAAAAAgO+2/iN6peibt+O5fpL4+vN59b7kzvuO86sq5uOqJ5LX71xObXiFBQAAAADAe1gXkAEAAAAAIFNABgAAAAAgpIAMAAAAAEBIARkAAAAAgJACMgAAAAAAIQVkAAAAAABCCsgAAAAAAIQUkAEAAAAACD1YQD5fjh8fl49xO5wun3nvbZ+X0+HecwAAAAAA+A4PFJCfKQIrIAMAAAAA/BQPFJDT08eH0yMlYAVkAAAAAICfQgEZAAAAAIBQW0D+PF0O5f3G1TuOP0+H6/68rQrJ52P12bkqGC8KyM2xSsoAAAAAAO9kXUDOxeNrMTd6Yjh+ArkUl4/nvGNwPuYCcV1AHvctDkzHHS5qyAAAAAAA72NRQO68XmJ6UnhZ3I0KyGnfsiic5P1NAfk4fLLQFK4BAAAAAPhu1wJyr4ib919rw0EBOb+OoqkfN0XpTpE6LEoDAAAAAPCdmgLy9HqJYLsWd3sF5OgVFPcVkNsnmAEAAAAA+C5NAfl2DffrnkBWQAYAAAAAeB/tO5BvFnGDAvKN118oIAMAAAAA/DyLAvIgP0ncFIdXBd+ggDw4Hz+qp5BzsVgBGQAAAADgR1oXkEe5iDxvnWJv87TxoBSR0za+E7kuGCsgAwAAAAD8FG0B+aVywVhhGAAAAADgx/naAvLuP8wHAAAAAMC7eVkBeXx9xbpQnF9L0byuAgAAAACAn+CFTyAv/mhe2Tx6DAAAAADwY33xO5ABAAAAAPipFJABAAAAAAgpIAMAAAAAEFJABgAAAAAgtCogn4/jH787XuY/fXc+Tn8Mb/5beJ+ny2H4+XD6zDsAAAAAAPitFJABAAAAAAjd9woLBWQAAAAAgD9DARkAAAAAgNDTr7D4PB2mYz4Op4uyMgAAAADA7/FcATl//jEfAAAAAADAb/F4ATn/t+IxAAAAAMDv9GAB+XQ5jsVjr60AAAAAAPi1HiogT6+t+Dhc/C09AAAAAIDf68EnkM+X00ERGQAAAADgN3vij+id02sslscDAAAAAPBrPFFAvv7sXcgAAAAAAL/PcwXkUSkie50FAAAAAMCvsiogN6YCssIwAAAAAMBftFlA/jwd1k8kAwAAAADwZ2wUkPMfyZvfXwEAAAAAwF/SFpDze4+nTfEYAAAAAODP2n4HMgAAAAAAf5YCMgAAAAAAIQVkAAAAAABCCsgAAAAAAIRWBeTzcfzjeceLP50HAAAAAIACMgAAAAAAIQVkAAAAAABCCsgAAAAAAIS2C8jn4/Dzx+V4/rycDuNneTucLp/5kNF83ufpcijHTOeNn1bnpp0AAAAAALy5XQXkj4/D5VQqxqVIvCgEp/OGbS4sr4vG86H53MPcGAAAAAAA72pXAbku+NbHpZ8XReZRKT6vnjjOheXqCWYAAAAAAN7PzldY5J+zz9MhKCAvzhvlp43rc6djFZABAAAAAN7eEwXk6xPHCsgAAAAAAL+PAjIAAAAAACEFZAAAAAAAQgrIAAAAAACEFJABAAAAAAitCsgAAAAAAFAoIAMAAAAAEFJABgAAAAAgpIAMAAAAAEBIARkAAAAAgJACMgAAAAAAIQVkAAAAAABCCsgAAAAAAIQUkAEAAAAACCkgAwAAAAAQUkAGAAAAACCkgAwAAAAAQCgoIJ8vx4+Py8diO5w+82fZ+TjtP57H/1wee7jUh47Wxxwv58/T5TD8d9MuAAAAAABvY11Ajgq7ed/HWC0ucgF53K67Py+nQy4Q5z3xvmuBWgEZAAAAAOB9LQrIudh7OA3/tfZ5OlxWTxfnAnJbAE7F4Xn/4knlle75AAAAAAC8i2sBeeu1EvmzuRDcKwyXInT+IL26Yvn0ceYVFgAAAAAAb68pILdF4UFd8L1VQM5PMU8F5OCJZgVkAAAAAID35wlkAAAAAABCd7wDeVEI7r3DuCo0N+9OztJ+BWQAAAAAgHe2KCAPosJw9LRwPm5dHE5/QG9dgA725fYUkAEAAAAA3tu6gDxaFHjL1ryqYn6FRS4Qly1633EpIs/b8XL2CgsAAAAAgLfXFpD36L4DeScFZAAAAACAt6eADAAAAABASAEZAAAAAICQAjIAAAAAAKHHCsgAAAAAAPx6CsgAAAAAAIQUkAEAAAAACCkgAwAAAAAQUkAGAAAAACD0kgLy5+lw+fg4Xs75ZwAAAAAAfr6XFJDPxw8FZAAAAACAX0YBGQAAAACA0KqAPBeCz8fhf5dF4c/L6TD+nLfDadgz7j5dDmXfvCkkAwAAAAD8BkEBedhKgXiSi8fHRVn483Q5LX70BDIAAAAAwO8TFJAPl9O1ejw/ZXxY7VxTQAYAAAAA+H3iV1jkn5Pz5Ti9mqIqLC8oIAMAAAAA/D47CsiD6l3Hy7dZjBSQAQAAAAB+n30F5Fl5Gnn9SgsFZAAAAACA3+fOAvKo/aN6CsgAAAAAAL/P7QLy5+lyXL38OD2FvHwC+fN0GM7rvyMZAAAAAICfZ9cTyKlAPH6WtmXxOMlPJU+fexIZAAAAAOA3WBWQAQAAAACgUEAGAAAAACCkgAwAAAAAQEgBGQAAAACAkAIyAAAAAAAhBWQAAAAAAEIKyAAAAAAAhBSQAQAAAAAIKSADAAAAABBSQAYAAAAAIKSADAAAAABASAEZAAAAAIDQooD8eTkdPi4fh9PwX0vny/Hj43I4jXt7xwyfnA6Xj4/j5Xw+Dv/7cTme8wejz9PlMOz7WO9Mba32AQAAAADwLu4sIJdC8eGSf8yWxeD18ZNcVF63nY5TPwYAAAAAeE93F5DL08SrAnHel4rBbTvn4/jzYThmUXieisrHoXUAAAAAAN7R/QXk4LjpqeT657k4nI4/ntdPHNfnAAAAAADwXh4oIMcF4u4TydN/p2OnJ5HTzvYcAAAAAADeykMF5LLvWiCO34k8nTO+qqI8djz+99T+eH59DgAAAAAA72RRQM5PCNcF5Oidx4PyNPH0NHIpEC+Uz8f/nc8txeaT9x8DAAAAALy7VQF5ekJ4VSzOTyUHBeR07OFyGD4P6seLz5dPGucnk4d9UdEZAAAAAID3sS4gD9L7jVPReCwAnz6jV1iM0v7+k8T58+qJ5tK++jEAAAAAwHtrCsgAAAAAADBSQAYAAAAAIKSADAAAAABASAEZAAAAAICQAjIAAAAAACEFZAAAAAAAQgrIAAAAAACEFJABAAAAAAgpIAMAAAAAEFJABgAAAAAgpIAMAAAAAEBIARkAAAAAgNBcQP48HS4fHx+X4znvmJwvx2Hfx+F0+d9x+N+P47Cncj7O552nY4JtOP8zHw4AAAAAwM+weAL583I6jAXfa5E4FYTzz4tC8dJ0TKdAnIrSh8tJ9RgAAAAA4MdZv8Li83Q5fHxcDmPFN//3tWCcn0ZeVZDTvun42rItAAAAAAB+nOYdyOmp4ePlOD5ZXD1uXD671pTHp5KD11qUp5m9ugIAAAAA4McK/oheftI4KgxXTyVPr6+o32kxiN+nDAAAAADAT9J5AnksIEfF4fxk8bQ/FZrbQ1KROSosAwAAAADwc4TvQE714fiP5s2vsei8vmL1h/cAAAAAAPixFgXk+r3F+eemGDw+eXy4HIbPmj+Q1yk6AwAAAADw88wF5PTk8OGyqgl3XkcRHptfaTG//mK1eSIZAAAAAOCnCf6I3m1TAXl+UhkAAAAAgN/ogQJy54/nAQAAAADwq9xdQPb0MQAAAADA37C7gPx5OnifMQAAAADAH/LQO5ABAAAAAPj9FJABAAAAAAgpIAMAAAAAEFJABgAAAAAg9EsLyJ+X0+Hj8nE4Df/V8Xm6HD4+LodT9wgAAAAAgD+tKSB/ng6Xj4+PeYsLrLlAOx93uHTrsOfj4rhh2yrqjnJhd/P4us3m+grIAAAAAADPWheQz8d1QTUXatdF1lI8Pl7OZc9UdG6LyOdjVNzd0BR1z5fjWCA+liuNxn3rNkvR+3qYAjIAAAAAwLNuvMIiF2KXBdxceF3VdPNxbfH5juLxYCo410XfXe3U/VRABgAAAAB41pcVkKdi8PqgG9LTxk1Bd1ehd0cBObczF6MX7dav7bir2wAAAAAAv9RmATkVVq+vqijSqynqV1gsj+sUg7eEhelR9BqLWn29uoCc21j2cS4or/t592s3AAAAAAB+qaaAnAqoedso2q6e2q1fFTEXg3MhtxwXFKNn3QJy/XRxrVxjWfRdFpDL59W1SwG5affW9QAAAAAA/obtV1iEf0QveCI4Hzfvmp/uXT/Ju/l070MF5PJkcX3etYB86l0zXy96SnrqZ10UBwAAAAD4Y268A3mss65fT9F7rcVqf684u1G0LZ+1deL4FRbXJ6CjgnR56jhtW9frFpC3npYGAAAAAPgDbhaQ09PF1yJt9+nc1XGp6NsrBocF3e5n7f65eBw+lTy6PoF8zsc27XoCGQAAAABg091PIPeezl0flwq49xRtyzlN4bYqYG+3UazbSn2uCtq5nbYIvVXkBgAAAAD4OxYF5LHoWhWGo3cgR4XX6Li873pYLuo2xehFcbhpp/f0cVvAXquL0eXabSH6Vh8BAAAAAP6q6gnkVLAdi6ppWxRcV+rjotdVDBZF2mmrni5uCsijXEQuW/0k8PXdx9FW2qoLyKNSHM5tzk8yn+f9aVM8BgAAAAAY3X4HMgAAAAAAf5ICMgAAAAAAgcvl/3TAcEwNwjW1AAAAAElFTkSuQmCC" alt="" />
总结
​使用老式读取,返回的是一个包含每行数据的数组,而yield方式则返回的是一个迭代器,而不会以真正的数组返回。
这种方法的优点是显而易见的,它可以让你在处理大数据集合的时候不用一次性的加载到内存中,甚至你可以处理无限大的数据流。

PHP学习之迭代生成器的更多相关文章

  1. ES6学习笔记<三> 生成器函数与yield

    为什么要把这个内容拿出来单独做一篇学习笔记? 生成器函数比较重要,相对不是很容易理解,单独做一篇笔记详细聊一聊生成器函数. 标题为什么是生成器函数与yield? 生成器函数类似其他服务器端语音中的接口 ...

  2. PHP迭代生成器---yield

    1.迭代生成器 生成器的核心是一个yield关键字,一个生成器函数看起来像一个普通的函数,不同的是:普通函数返回一个值,而一个生成器可以yield生成许多它所需要的值.生成器函数被调用时,返回的是一个 ...

  3. python3使用迭代生成器yield减少内存占用

    技术背景 在python编码中for循环处理任务时,会将所有的待遍历参量加载到内存中.其实这本没有必要,因为这些参量很有可能是一次性使用的,甚至很多场景下这些参量是不需要同时存储在内存中的,这时候就会 ...

  4. Python学习笔记之生成器、迭代器和装饰器

    这篇文章主要介绍 Python 中几个常用的高级特性,用好这几个特性可以让自己的代码更加 Pythonnic 哦 1.生成器 什么是生成器呢?简单来说,在 Python 中一边循环一边计算的机制称为 ...

  5. python-切片 迭代 生成器

    1 切片操作 >>> L ['aaa', 'bbb', 'ccc', 'ddd'] >>> L[0:3] ['aaa', 'bbb', 'ccc'] >> ...

  6. javascript学习笔记--迭代函数

    概要 这里的迭代函数指的是对数组对象的操作方法,js数组共有五个迭代函数:every.fifter.forEach.map.some. 1.every every方法,返回值为Boolean类型,tr ...

  7. Python学习day17 迭代器&生成器

    迭代器&生成器 1. 迭代器 1.1 迭代器 迭代:迭代是重复反馈过程的活动,其目的通常是为了逼近所需目标或结果.每一次对过程的重复称为一次"迭代" 迭代器:帮助对某种对象 ...

  8. 廖雪峰老师博客学习《通过生成器generator生成列表式杨辉三角》

    说明:这是我接触生成器概念后,自己对它的理解,可能比较表面,没深入理解,也可能有错误.后续校正错误认知,将有关generator作为一个tag了! 希望以后能活用. 先贴出自己写的triangles( ...

  9. python学习日记(生成器函数进阶)

    迭代器和生成器的概念 迭代器 对于list.string.tuple.dict等这些容器对象,使用for循环遍历是很方便的.在后台for语句对容器对象调用iter()函数.iter()是python内 ...

随机推荐

  1. maven-jetty插件配置时,webdefault.xml的取得和修改

    取得 没必要去下载一个jetty客户端去找webdefault.xml了. 可以去maven的本地仓库找到 \org\eclipse\jetty\jetty-webapp\版本号\ 里面的jar文件, ...

  2. tomcat控制前台到后台的乱码问题

    1.找到tomcat中的conf文件下的server.xml文件. 2.点击打开后找到 <Connector  port="8080" protocol="HTTP ...

  3. 使用linux中,最让人无语的是软件源

    使用linux的最大的障碍是软件源的配置和系统的安装,这两个搞定了,坚持使用下去都不是问题,如果实在不行,还可以win10下的linux子系统可以作为基本的使用.下面记录两个软件源: Found 2 ...

  4. cs配合msf批量探测内网MS17-010漏洞

    第一步 Cobalt strike 派生 shell 给 MSF(前提有个beacon shell) 第二步 选择要派生的beacon,右键-->增加会话,选择刚刚配置的foreign监听器 第 ...

  5. mvc partialView断点调试问题

    mvc中的partialview 在前端f12调试时,默认看不到代码的.  在Js中加上debugger;  调试时会走到断点,多出个VM打头的局部视图页面.

  6. Ubuntu下制作deb包的方法详解

    1  认识deb包 1.1   认识deb包 deb是Unix系统(其实主要是Linux)下的安装包,基于 tar 包,因此本身会记录文件的权限(读/写/可执行)以及所有者/用户组. 由于 Unix ...

  7. ArcGIS超级工具SPTOOLS-制图篇

    1.1  梯形接幅表的创建 视频:https://weibo.com/tv/v/Hvq9KzKKQ?fid=1034:4374886702060760 根据一个图层范围,生成接幅表,支持地图比例尺有1 ...

  8. [java]取当前时间

    /** * Get current date time * * @return */ private static String getCurrTime() { SimpleDateFormat sd ...

  9. C之枚举

    #include<stdio.h>#include<stdlib.h>enum WeekDay{ Monday,Tuesday,Wednesday,Thursday,Frida ...

  10. Linux与linux之间传递文件、

    1.从linux本机文件上传到另一台linux格式:scp 要传的文件 root@目标ip:路径scp –r 要传的目录 root@目标ip:路径 例子: scp  /root/1.txt   roo ...