我們的數(shù)據(jù)庫常常都是很龐大的,一次查詢的結(jié)果集也很大,這樣很浪費內(nèi)存,為了降低內(nèi)存的使用率,我們可以使用yii2的batch和each方法。
為了讓大家看的更明白,我們模擬一個場景,然后通過yii2的debug來查看all與batch/each方法下的內(nèi)存使用情況。
開始準備
我們先建立一張表,它很簡單。
你看到了,它有主鍵id、會員名username、所在省province,現(xiàn)在它是空的。
然后,我們執(zhí)行了一個循環(huán)
set_time_limit(0); for($i=1;$idb->createCommand()->insert("user",[ ????????'username'=>'abei'.$i, ????????'province'=>'北京市' ????])->execute(); }
執(zhí)行后,你知道我們的數(shù)據(jù)庫里有10000條記錄了,現(xiàn)在我們開始對比。
對比
為了方便,我們在視圖里直接寫循環(huán)體,如下面代碼,你一定可以看懂。
$query?=?new?yiidbQuery(); $query->from('user'); foreach($query->all()?as?$user){ ????echo?$user['username']; ????echo?"<br>"; }
結(jié)果那?
占有內(nèi)存 15.306MB
OK,現(xiàn)在開始看看batch和each的戲法,到底有沒有節(jié)省內(nèi)存。
$query?=?new?yiidbQuery(); $query->from('user'); foreach($query->batch()?as?$users){ ????????foreach($users?as?$user){ ????????echo?$user['username']; ????????echo?"<br>"; ????} }
結(jié)果那?
果然,節(jié)省了一半的內(nèi)存。現(xiàn)在僅僅占用了8.077MB
同樣的
$query?=?new?yiidbQuery(); $query->from('user'); foreach($query->each()?as?$user){ ????echo?$user['username']; ????echo?"<br>"; }
each的表現(xiàn)也相當不錯
結(jié)果
當我們遇到需要一次讀取出所有的或是大批量數(shù)據(jù)的時候,可以考慮使用batch和each,這一點點代碼的優(yōu)化幫你省掉了一半的內(nèi)存。
PHP中文網(wǎng),有大量免費的Yii入門教程,歡迎大家學習!
? 版權(quán)聲明
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載。
THE END
喜歡就支持一下吧
相關推薦