昨日, 有朋友在PHP探討(tǎo)群内提及, 他(tā)做(zuò)的(de)一個(gè)新項目因爲MySQL查尋回到的(de)結果過多(duō)(達十萬條), 進而造成PHP存儲空間不足用(yòng). 因此, 他(tā)問, 在實行下(xià)邊的(de)編碼解析xml回到的(de)MySQL結果以前, 數據信息是不是早已在運行内存中了(le)? -
自然, 這(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)涵數:
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)不同點:
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)完成:
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)檔網站建設
留下(xià)聯系方式,我們将會在一個(gè)工作日内與你聯系