ThinkPHP3.2 執行腳本時,佔用內存越來越大

      最近同事在使用TP寫腳本時,發現老是內存不足。在沒有增加變量時,隨着進程執行的時間變長,佔用的內存空間明顯增加。尤其是用for循環去訪問數據庫時。

    通常大家一遇到內存不足,就會考慮增加進程最大使用內存,例如用 ini_set('memory_limit', '10000...M')設置內存上限。

     當仔細分析代碼後仍然無法發現問題時,就要考慮是不是TP哪裏出了問題。

     ThinkPHP一個進程執行的過程中, 運行到某個切面時會觸發記錄日誌(調用Log.class.php中的record方法), 在記錄系統日誌的時,ThinkPHP先是給所有日誌信息記錄在內存裏(Log.class.php 中的$Log變量數組),最後一次性寫入文件,這樣做的目的主要是減少open file的次數,提高寫Log的效率。當系統日誌信息積累過多時,進程佔用的內存空間就會越來越大了。

測試代碼如下:

通過測試,可以發現內存空間明顯地線性增加:

修改record方法,定期100條批量保存一次日誌到磁盤,同時釋放Log

修改record方法後,效果十分明顯。(目前TP5據說就是這麼修改的)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章