27
18911184380
當前位置:首頁 > 資訊 > 建站知識

PHP查詢MySQL大(dà)量數據的(de)内存占用(yòng)分(fēn)析

2011-10-22 酷站科技 大(dà)

PHP查尋MySQL很多(duō)數據信息的(de)内存占用(yòng)剖析

      本文關鍵是以基本原理(lǐ), 指南(nán)和(hé)源代碼剖析在PHP中查尋MySQL回到很多(duō)結果時(shí), 内存占用(yòng)的(de)難題, 另外對(duì)應用(yòng)MySQL C API也(yě)是有涉及到.

  昨日, 有朋友在PHP探討(tǎo)群内提及, 他(tā)做(zuò)的(de)一個(gè)新項目因爲MySQL查尋回到的(de)結果過多(duō)(達十萬條), 進而造成PHP存儲空間不足用(yòng). 因此, 他(tā)問, 在實行下(xià)邊的(de)編碼解析xml回到的(de)MySQL結果以前, 數據信息是不是早已在運行内存中了(le)? -

  1. while ($row = mysql_fetch_assoc($result)) { 
  2.     // ... 

  自然, 這(zhè)類難題有很多(duō)優化(huà)的(de)方式 . 但是, 就這(zhè)個(gè)難題而言, 我最先想起, MySQL是經典的(de)C/S(Client/Server, 手機客戶端/網絡服務器)實體模型, 在解析xml結果集以前, 最底層的(de)完成很有可(kě)能早已把全部的(de)數據信息根據互聯網(假定應用(yòng)TCP/IP)讀來(lái)到Client的(de)緩沖區(qū)域, 也(yě)是有另一種很有可(kě)能, 便是數據信息仍在Server端發送緩沖區(qū)裏, 并沒有發送給Client.

  在查詢PHP和(hé)MySQL的(de)源代碼以前, 我注意到PHP指南(nán)裏有兩個(gè)作用(yòng)相仿的(de)涵數:

  1. mysql_query() 
  2.  
  3. mysql_unbuffered_query() 

  2個(gè)涵數的(de)字面意思和(hé)表明(míng)确認了(le)我的(de)想法, 前一個(gè)涵數實行時(shí), 會把全部的(de)結果集從Server端讀完Client端緩沖區(qū)域中, 然後一個(gè)則沒有, 這(zhè)就是”unbuffered(未緩存)”的(de)含意.

  那就是說, 假如用(yòng)mysql_unbuffered_query()實行了(le)一條回到很多(duō)結果集的(de)SQL句子, 在解析xml結果以前, PHP的(de)運行内存是沒有被結果集占有的(de). 而用(yòng)mysql_query()來(lái)實行一樣的(de)句子得(de)話(huà), 涵數回到時(shí), PHP的(de)内存占用(yòng)便會大(dà)幅度提升, 馬上耗完運行内存.

  假如閱讀文章(zhāng)PHP的(de)有關編碼, 能夠見到這(zhè)兩個(gè)涵數的(de)完成上的(de)不同點:

  1. /* {{{ proto resource mysql_query(string query [, int link_identifier]) 
  2.    Sends an SQL query to MySQL */ 
  3. PHP_FUNCTION(mysql_query) 
  4.     php_mysql_do_query(INTERNAL_FUNCTION_PARAM_PASSTHRU, MYSQL_STORE_RESULT); 
  5. /* }}} */ 
  6.  
  7. /* {{{ proto resource mysql_unbuffered_query(string query [, int link_identifier]) 
  8.    Sends an SQL query to MySQL, without fetching and buffering the result rows */ 
  9. PHP_FUNCTION(mysql_unbuffered_query) 
  10.     php_mysql_do_query(INTERNAL_FUNCTION_PARAM_PASSTHRU, MYSQL_USE_RESULT); 
  11. /* }}} */ 

  2個(gè)涵數都啓用(yòng)了(le)php_mysql_do_query(), 隻差了(le)第2個(gè)主要參數的(de)不一樣, MYSQL_STORE_RESULT和(hé)MYSQL_USE_RESULT. 再看php_mysql_do_query()的(de)完成:

  1. if(use_store == MYSQL_USE_RESULT) { 
  2.     mysql_result=mysql_use_result(&mysql->conn); 
  3. else { 
  4.     mysql_result=mysql_store_result(&mysql->conn); 

  mysql_use_result()和(hé)mysql_store_result()是MySQL的(de)C API函數, 這(zhè)兩個(gè)C API函數的(de)差别便是後面一種把結果集從MySQL Server端所有載入來(lái)到Client端, 前面一種僅僅載入了(le)結果集的(de)元信息内容.

  返回PHP, 應用(yòng)mysql_unbuffered_query(), 能夠防止運行内存的(de)馬上占有. 假如在解析xml的(de)全過程不對(duì)結果開展”PHP緩存文件”(如放進某數字能量數組中), 則全部實行全過程盡管實際操作了(le)十萬條或是百萬條或是大(dà)量的(de)數據信息, 但PHP占有的(de)運行内存自始至終是十分(fēn)小的(de).

标識:北(běi)京市網站制作 高(gāo)檔網站建設

來(lái)源于申明(míng):以上内容一部分(fēn)(包括照(zhào)片、文本)來(lái)自互聯網,若有侵權行爲,請立即與本網站聯絡(010-57218159)。
如沒特殊注明(míng),文章(zhāng)均爲酷站科技原創,轉載請注明(míng)來(lái)自39091.html
聯系專業的(de)商務顧問,制定方案,專業設計,一對(duì)一咨詢及其報價詳情
服務熱(rè)線服務熱(rè)線 18911184380
聯系我們 contact us
18911184380
18911184380 — 海澱營業部
18911184380— 昌平營業部
+

酷站科技爲你提供上門/網站策略方案

留下(xià)聯系方式,我們将會在一個(gè)工作日内與你聯系

隐私條款信息保護中,請放心填寫