php查詢mysql大量數據佔用大量內存導致內存不足

php查詢mysql大量數據佔用大量內存導致內存不足

場景:

使用php查詢mysql導出16萬條數據到文件中,尚未執行完畢,跳出警告:
PHP Fatal error:  Allowed memory size of 134217728 bytes exhausted (tried to allocate 32 bytes) 

錯誤提示:php所分配到的128M內存被佔用完畢。
最簡單的解決辦法是:在執行文件的頭部增加:ini_set(‘memory_limit’,’256M’);
256M或者更多,可以增大php所使用的內存空間

但是下次若要讀取更多的數據該怎麼辦呢,總不能一次次的增加,導致服務器的內存都被php喫光。

使用memory_get_usage()方法獲得php使用的內存量。發現隨着讀取數據條數的增加,php使用的內存在一步步增加。

難道php在查詢mysql時的數據是存在內存中的?搜索了一下,發現果真大概就是這個意思。
mysql的C API函數有mysql_use_result()和mysql_store_result()
mysql_store_result()會把結果集從mysqlServer讀到客戶端
而 mysql_use_result()只是讀取了結果集的元信息

1、php的mysql_query調用的是mysql_store_result(),自動獲取並緩存結果集
2、而php的另一個函數mysql_unbuffered_query()則是調用的 mysql_use_result(),一方面,這在處理很大的結果集時會節省可觀的內存。另一方面,可以在獲取第一行後立即對結果集進行操作,而不用等到整個 SQL 語句都執行完畢。

所以我們在讀取大量數據的時候,可以使用mysql_unbuffered_query()來替代mysql_query()。經測試,的確如此。而且相當給力,導完所有數據內存一直保持在1MB以內,沒有增長過


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