Laravel
中使用cursor
來查詢並處理數據 (輕鬆處理千萬級的數據)最近在項目中遇到內存不足的問題, 測試環境中的PHP內存只有64M,在導出的時候, 數據量比較大,這個時候會出現內存溢出的錯誤;
目前想到兩種方法:php
php.ini
文件中memory_limit
配置項; 或者在調用方法中調整內存大小ini_set('memory_limit', "")
.Laravel
的Lazy Collection
.考慮到修改配置文件的影響範圍過大, 以及對導出的實時性要求不是很高, 因此咱們選擇了第二種方法.
如何使用Lazy Collection
? 很簡單, 將查詢構建器鏈末尾的get()
更改成cursor()
就行了 !app
cursor
的原理cursor
的實現使用了yield
關鍵字,yield
關鍵字是生成器函數的核心, 它的調用形式跟return
很像, 不一樣之處在於return會返回值而且終止函數執行, 而yield
會返回值給循環調用生成器的代碼而且只是暫停生成器函數.
cursor()
的代碼以下/** * Get a generator for the given query. * * @return Generator */ public function cursor() { foreach ($this->applyScopes()->query->cursor() as $record) { yield $this->newModelInstance()->newFromBuilder($record); } }
因爲使用了yield
關鍵字, 在循環cursor
生成器的時候,能夠漸進式的處理數據,即便在內存很小的狀況下,也能夠輕鬆處理千萬級的數據! 真的是很是方便哦!