✨前言php
最近須要把一批地理數據存到redis上面,方便做爲一個地理範圍檢索的用途使用,可是奈何數據量幾十萬級的,動不動PHP就會報內存溢出了,這樣子還得找辦法解決redis
✨yield的出現數據庫
在我苦思一頓以後(實際上是摸魚摸出來的),發現了PHP居然有如此神功(yield),能夠助我羽化登仙,呸呸呸。數組
✨實踐是檢驗真理的惟一標註緩存
本質 其實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這種方式去處理數據,已達到節省內存空間的效果。
有任何的意見或者錯誤的地方歡迎指出,虛心接收😝😝😝以爲能夠幫到本身的麻煩點個贊👍給點支持鼓勵❤❤❤