php的隐藏知识点--yield
很多PHPer都忽略一个强大的知识点yield - 产出值,那我们先来说说他的优点 和 场景:
1,优点:
1)能够提高PHP的性能;
2)能够节省内存资源;
3)能够用于大数据的处理;
2,场景:
1)大数据的处理,比如100W,甚至1000W;
2)读取文件,比如csv,txt等的大数据文件,比如5个G的;
接着来说说它的具体操作,直接上代码:
平时我们会直接用这样来把所有的数据存储到$data数组中,一次性存完:
function test($num){
for ($i=0; $i < $num; $i++) {
$data[] = $i;
}
}
$result = test(10);
foreach($result as $value){
echo value.'<br/>';
}
但如果数据过大的时候,比如1000W,这样就会造成内存性能的消耗,如果硬件不强,则可能整个服务器崩溃,那这个时候yield就派上用场了:
function test($num){
for ($i=0; $i < $num; $i++) {
yield $i;
}
}
$result = test(10000000);
foreach($result as $value){
echo $value.'<br/>';
}
这个时候输出,可能会受到php.ini的时间上的限制报错提示,如: Maximum execution time of 30 seconds
那这个时候就可以在程序上面设置 set_time_limit(0);//来表示无限制超时时间。
yield的作用实际上是结合foreach来使用的,因为你 test()函数里面循环一次,然后在内存上告诉foreach,我已经循环一次有数据了,你可以获取了,接着foreach循环一次,也就在调用test()方法里的for循环一次,就一次一次的执行,并不是一次性所有都执行完毕,这样在很大程序上利用好了内存,并间接的提高了php的性能。
在来看个例子:
function getContent($url){
$fp = fopen($url, 'r');
yield fgets($fp); //读取文件一行一行的数据
}
foreach(getContent($url) as $value){
echo $value.'<br/>';
}
这样就可以完美的读取几个G以上的文件了,也不会卡死。
若各位看客有疑问或者觉得哪里不好的,可以留言交流,技术在于交流和不足中完善,转载请注明出处,thanks。