php查詢mysql大量數(shù)據(jù)造成內(nèi)存不足的解決方法
本文實(shí)例分析了php查詢mysql大量數(shù)據(jù)造成內(nèi)存不足的解決方法。分享給大家供大家參考。具體分析如下:
一、問(wèn)題
使用php查詢mysql大數(shù)據(jù)量的時(shí)候,程序尚未執(zhí)行完畢,跳出警告:
Fatal error: Allowed memory size of 100663296 bytes exhausted (tried to allocate 103 bytes)
錯(cuò)誤提示:php所分配到的100M內(nèi)存被占用完畢。
二、解決方法:
最簡(jiǎn)單的解決辦法是:在執(zhí)行文件的頭部增加:
ini_set('memory_limit','256M');
把內(nèi)存增加到256M或者更多,可以增大php所使用的內(nèi)存空間
但是下次若要讀取更多的數(shù)據(jù)該怎么辦呢,總不能一次次的增加,導(dǎo)致服務(wù)器的內(nèi)存都被php吃光。
這里介紹一個(gè)函數(shù):
使用memory_get_usage()方法獲得php使用的內(nèi)存量。發(fā)現(xiàn)隨著讀取數(shù)據(jù)條數(shù)的增加,php使用的內(nèi)存在一步步增加。
難道php在查詢mysql時(shí)的數(shù)據(jù)是存在內(nèi)存中的?搜索了一下,發(fā)現(xiàn)果真大概就是這個(gè)意思。
mysql的C API函數(shù)有mysql_use_result()和mysql_store_result()
mysql_store_result()會(huì)把結(jié)果集從mysqlServer讀到客戶端,而 mysql_use_result()只是讀取了結(jié)果集的元信息
1、php的mysql_query調(diào)用的是mysql_store_result(),自動(dòng)獲取并緩存結(jié)果集
2、而php的另一個(gè)函數(shù)mysql_unbuffered_query()則是調(diào)用的 mysql_use_result(),一方面,這在處理很大的結(jié)果集時(shí)會(huì)節(jié)省可觀的內(nèi)存。另一方面,可以在獲取第一行后立即對(duì)結(jié)果集進(jìn)行操作,而不用等到整個(gè) SQL 語(yǔ)句都執(zhí)行完畢。
所以我們?cè)谧x取大量數(shù)據(jù)的時(shí)候,可以使用mysql_unbuffered_query()來(lái)替代mysql_query()。經(jīng)測(cè)試,的確如此。而且相當(dāng)給力,導(dǎo)完所有數(shù)據(jù)內(nèi)存一直保持在1MB以內(nèi),沒有增長(zhǎng)過(guò)
mysql_unbuffered_query() 向 MySQL 發(fā)送一條 SQL 查詢 query,但不像 mysql_query()那樣自動(dòng)獲取并緩存結(jié)果集。一方面,這在處理很大的結(jié)果集時(shí)會(huì)節(jié)省可觀的內(nèi)存。另一方面,可以在獲取第一行后立即對(duì)結(jié)果集進(jìn)行操作,而不用等到整個(gè) SQL 語(yǔ)句都執(zhí)行完畢。當(dāng)使用多個(gè)數(shù)據(jù)庫(kù)連接時(shí),必須指定可選參數(shù) link_identifier。
mysql_unbuffered_query()的好處是有代價(jià)的:在 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ù)
希望本文所述對(duì)大家的php程序設(shè)計(jì)有所幫助。
- 解決PHP里大量數(shù)據(jù)循環(huán)時(shí)內(nèi)存耗盡的方法
- php post大量數(shù)據(jù)時(shí)發(fā)現(xiàn)數(shù)據(jù)丟失問(wèn)題解決方法
- php導(dǎo)入大量數(shù)據(jù)到mysql性能優(yōu)化技巧
- 2個(gè)自定義的PHP in_array 函數(shù),解決大量數(shù)據(jù)判斷in_array的效率問(wèn)題
- php 表單提交大量數(shù)據(jù)發(fā)生丟失的解決方法
- phpExcel導(dǎo)出大量數(shù)據(jù)出現(xiàn)內(nèi)存溢出錯(cuò)誤的解決方法
- PHP查詢MySQL大量數(shù)據(jù)的時(shí)候內(nèi)存占用分析
- phpmyadmin里面導(dǎo)入sql語(yǔ)句格式的大量數(shù)據(jù)的方法
- asp和php下textarea提交大量數(shù)據(jù)發(fā)生丟失的解決方法
- PHP查詢大量數(shù)據(jù)內(nèi)存耗盡問(wèn)題的解決方法
相關(guān)文章
PHP實(shí)現(xiàn)將漢字轉(zhuǎn)換為拼音及獲取詞語(yǔ)首字母的方法
這篇文章主要介紹了PHP實(shí)現(xiàn)將漢字轉(zhuǎn)換為拼音及獲取詞語(yǔ)首字母的方法,涉及php字符串、數(shù)組的遍歷及編碼轉(zhuǎn)換相關(guān)操作技巧,需要的朋友可以參考下2017-08-08php使用gettimeofday函數(shù)返回當(dāng)前時(shí)間并存放在關(guān)聯(lián)數(shù)組里
這篇文章主要介紹了php使用gettimeofday函數(shù)返回當(dāng)前時(shí)間并存放在關(guān)聯(lián)數(shù)組里的方法,涉及php中g(shù)ettimeofday函數(shù)的使用技巧,需要的朋友可以參考下2015-03-03php上的memcache和memcached兩個(gè)pecl庫(kù)
一開始就在疑惑為什么會(huì)有兩個(gè)庫(kù),且在php.net官方都有文檔支持。2010-03-03PHP基于socket實(shí)現(xiàn)客戶端和服務(wù)端通訊功能
這篇文章主要介紹了PHP基于socket實(shí)現(xiàn)客戶端和服務(wù)端通訊功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07生成ubuntu自動(dòng)切換壁紙xml文件的php代碼
運(yùn)行代碼后在圖片目錄下會(huì)生成yuxing.xml,方便ubuntu自動(dòng)切換壁紙.2010-07-07PHP操作SQL Server數(shù)據(jù)庫(kù)實(shí)現(xiàn)表的改查與統(tǒng)計(jì)
這篇文章主要介紹了如何利用PHP對(duì)MS SQL Server數(shù)據(jù)表的查詢、統(tǒng)計(jì)與修改,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2022-03-03php-perl哈希算法實(shí)現(xiàn)(times33哈希算法)
php-perl哈希實(shí)現(xiàn)算法–DJBX33A(Daniel J. Bernstein, Times 33 with Addition)APR哈希默認(rèn)算法2013-12-12