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這種方式去處理數據,已達到節省內存空間的效果。

    有任何的意見或者錯誤的地方歡迎指出,虛心接收😝😝😝以爲能夠幫到本身的麻煩點個贊👍給點支持鼓勵❤❤❤

相關文章
相關標籤/搜索