The Best Fluffy Pancakes recipe you will fall in love with. Full of tips and tricks to help you make the best pancakes.

php 迴圈記憶體使用優化方法

從一開始接觸php到現在,自以為對陣列迴圈操作很熟悉,array_map、array_filter……等等的操作都不是問題,pdo取得資料後永遠都是用fetchAll(),很嫌棄一開始老師教的while($cursor) 的資料存取法,覺得寫那樣好麻煩,直到某天看到了這篇文章…..

php yield的使用 (成為 Modern PHPer系列 第 6 篇) https://ithelp.ithome.com.tw/articles/10214084

原來用直接用foreach、for等迴圈、fetchAll等等都是非常消耗記憶體的做法,所有資料都會被載到記憶體中,等待他被處理到的那刻才有它存在的意義。

如此當資料的總欄位數(row * column)來到上千個時,就會出現記憶體不足,以前就很直覺地去修改php.ini中的相關設定,單純以為資料大就是需要多的記憶體。

現在學到了原來其實有Iterator、IteratorAggregate、Generator&yield可以讓迴圈中的記憶體占用只存在於該row中, 此方法也可用於檔案切分傳遞,使電腦資源不會因大量資料的迴圈造成耗竭。

另外原來資料庫操作中的cursor也是類似的概念,每次記憶體只占用於該cursor(row)的部分,在laravel中的語法可用

$result = Model::where('column', 'search_text')->cursor();

再把結果放到迴圈中使用,而不要再都傻傻的->get()或fetchAll()一次把資料全部叫出來

結論

上述方法可以有效減少記憶體使用量,但在撰寫時會比較繁瑣,所以日常可以視情況使用,如果資料量不大,就隨手直接用foreach就行,但如果是大量資料處裡的時候,就一定要記得使用上面這些方法,這樣才能成為一位優秀的Modern PHPer!

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *