php yield的了解及使用

  1. ✨前言php

    最近须要把一批地理数据存到redis上面,方便做为一个地理范围检索的用途使用,可是奈何数据量几十万级的,动不动PHP就会报内存溢出了,这样子还得找办法解决redis

  2. yield的出现数据库

    在我苦思一顿以后(实际上是摸鱼摸出来的),发现了PHP居然有如此神功(yield),能够助我羽化登仙,呸呸呸。数组

  3. 实践是检验真理的惟一标注缓存

  • 本质  其实yield的实质能够看做一个单向的链表,每一次取完数据就会日后移,直到到达了末尾bash


    输出结果:spa

    current:0 
    key:0 
    next: 
    valid:1 
    current:1
    复制代码

    当迭代生成器遍历完一次以后,想要继续遍历,会抛出异常,由此证实生成器在遍历完一次以后,就会失去了他本来的做用code


    0  
    1  
    2  
    3  
    4  
    Fatal error: Uncaught Exception: Cannot traverse an already closed generator in C:\xampp\htdocs\test.php:32 Stack trace: #0 {main} thrown in C:\xampp\htdocs\test.php on line 32复制代码
  • 占用内存 回到本次解决问题的中心点,就是要解决大量数据致使PHP内存溢出的问题,下面咱们来作一下简单的试验cdn


    实验结果:对象

    384056b 
    781032b 
    384056b 
    4578040b
    复制代码

    结果代表,生成器只是占用了存储自生对象的内存,不管数据再多,占用的内存不变,而通常的返回数组形式会致使数据越多占用的内存越高

  • 结合实际状况分析 也有人会想到,那放在yield里面的操做换成读数据库或者调用其余接口获取数据再返回,会不会在遍历的时候,每遍历一次就会读一次库或者调一次接口?


    实验结果:生成器所在的方法在遍历的时候只会被调用一次,而后后面都只是取数据-偏移的操做

    yield存在的方法被调用 
    0 
    1 
    2 
    3
    4 复制代码
最终结论

    若是你须要对一堆数据进行处理,好比把数据从数据库取出而后存储到redis缓存中,可使用yield这种方式去处理数据,已达到节省内存空间的效果。

    有任何的意见或者错误的地方欢迎指出,虚心接收😝😝😝以为能够帮到本身的麻烦点个赞👍给点支持鼓励❤❤❤

相关文章
相关标签/搜索