《PHP編程:php查詢mysql大量數(shù)據(jù)造成內(nèi)存不足的解決方法》要點:
本文介紹了PHP編程:php查詢mysql大量數(shù)據(jù)造成內(nèi)存不足的解決方法,希望對您有用。如果有疑問,可以聯(lián)系我們。
PHP實例本文實例分析了php查詢mysql大量數(shù)據(jù)造成內(nèi)存不足的解決辦法.分享給大家供大家參考.具體分析如下:
PHP實例一、問題
PHP實例使用php查詢mysql大數(shù)據(jù)量的時候,程序尚未執(zhí)行完畢,跳出警告:
Fatal error:? Allowed memory size of 100663296 bytes exhausted (tried to allocate 103 bytes)
錯誤提示:php所分配到的100M內(nèi)存被占用完畢.
PHP實例二、解決辦法:
PHP實例最簡單的解決方法是:在執(zhí)行文件的頭部增加:
PHP實例
ini_set('memory_limit','256M');
PHP實例把內(nèi)存增加到256M或者更多,可以增大php所使用的內(nèi)存空間
但是下次若要讀取更多的數(shù)據(jù)該怎么辦呢,總不能一次次的增加,導(dǎo)致服務(wù)器的內(nèi)存都被php吃光.
PHP實例這里介紹一個函數(shù):
PHP實例使用memory_get_usage()辦法獲得php使用的內(nèi)存量.發(fā)現(xiàn)隨著讀取數(shù)據(jù)條數(shù)的增加,php使用的內(nèi)存在一步步增加.
難道php在查詢mysql時的數(shù)據(jù)是存在內(nèi)存中的?搜索了一下,發(fā)現(xiàn)果真大概就是這個意思.
mysql的C API函數(shù)有mysql_use_result()和mysql_store_result()
mysql_store_result()會把結(jié)果集從mysqlServer讀到客戶端,而 mysql_use_result()只是讀取了結(jié)果集的元信息
PHP實例1、php的mysql_query調(diào)用的是mysql_store_result(),自動獲取并緩存結(jié)果集
2、而php的另一個函數(shù)mysql_unbuffered_query()則是調(diào)用的 mysql_use_result(),一方面,這在處理很大的結(jié)果集時會節(jié)省可觀的內(nèi)存.另一方面,可以在獲取第一行后立即對結(jié)果集進行操作,而不用等到整個 SQL 語句都執(zhí)行完畢.
PHP實例所以我們在讀取大量數(shù)據(jù)的時候,可以使用mysql_unbuffered_query()來替代mysql_query().經(jīng)測試,的確如此.而且相當(dāng)給力,導(dǎo)完所有數(shù)據(jù)內(nèi)存一直保持在1MB以內(nèi),沒有增長過
mysql_unbuffered_query() 向 MySQL 發(fā)送一條 SQL 查詢 query,但不像 mysql_query()那樣自動獲取并緩存結(jié)果集.一方面,這在處理很大的結(jié)果集時會節(jié)省可觀的內(nèi)存.另一方面,可以在獲取第一行后立即對結(jié)果集進行操作,而不用等到整個 SQL 語句都執(zhí)行完畢.當(dāng)使用多個數(shù)據(jù)庫連接時,必須指定可選參數(shù) link_identifier.
mysql_unbuffered_query()的好處是有代價的:在 mysql_unbuffered_query()返回的結(jié)果集之上不能使用 mysql_num_rows() 和 mysql_data_seek().此外在向 MySQL 發(fā)送一條新的 SQL 查詢之前,必須提取掉所有未緩存的 SQL 查詢所產(chǎn)生的結(jié)果行.
所以一定要結(jié)合自己的業(yè)務(wù)需求適當(dāng)?shù)倪x取函數(shù)
PHP實例希望本文所述對大家的php程序設(shè)計有所贊助.
《PHP編程:php查詢mysql大量數(shù)據(jù)造成內(nèi)存不足的解決方法》是否對您有啟發(fā),歡迎查看更多與《PHP編程:php查詢mysql大量數(shù)據(jù)造成內(nèi)存不足的解決方法》相關(guān)教程,學(xué)精學(xué)透。維易PHP學(xué)院為您提供精彩教程。
轉(zhuǎn)載請注明本頁網(wǎng)址:
http://www.fzlkiss.com/jiaocheng/11894.html