
昨日, 有朋友在PHP探討群內(nèi)提及, 他做的一個(gè)新項(xiàng)目因?yàn)镸ySQL查尋回到的結(jié)果過(guò)多(達(dá)十萬(wàn)條), 進(jìn)而造成PHP存儲(chǔ)空間不足用. 因此, 他問(wèn), 在實(shí)行下邊的編碼解析xml回到的MySQL結(jié)果以前, 數(shù)據(jù)信息是不是早已在運(yùn)行內(nèi)存中了? -
自然, 這類難題有很多優(yōu)化的方式 . 但是, 就這個(gè)難題而言, 我最先想起, MySQL是經(jīng)典的C/S(Client/Server, 手機(jī)客戶端/網(wǎng)絡(luò)服務(wù)器)實(shí)體模型, 在解析xml結(jié)果集以前, 最底層的完成很有可能早已把全部的數(shù)據(jù)信息根據(jù)互聯(lián)網(wǎng)(假定應(yīng)用TCP/IP)讀來(lái)到Client的緩沖區(qū)域, 也是有另一種很有可能, 便是數(shù)據(jù)信息仍在Server端發(fā)送緩沖區(qū)里, 并沒(méi)有發(fā)送給Client.
在查詢PHP和MySQL的源代碼以前, 我注意到PHP指南里有兩個(gè)作用相仿的涵數(shù):
2個(gè)涵數(shù)的字面意思和表明確認(rèn)了我的想法, 前一個(gè)涵數(shù)實(shí)行時(shí), 會(huì)把全部的結(jié)果集從Server端讀完Client端緩沖區(qū)域中, 然后一個(gè)則沒(méi)有, 這就是”unbuffered(未緩存)”的含意.
那就是說(shuō), 假如用mysql_unbuffered_query()實(shí)行了一條回到很多結(jié)果集的SQL句子, 在解析xml結(jié)果以前, PHP的運(yùn)行內(nèi)存是沒(méi)有被結(jié)果集占有的. 而用mysql_query()來(lái)實(shí)行一樣的句子得話, 涵數(shù)回到時(shí), PHP的內(nèi)存占用便會(huì)大幅度提升, 馬上耗完運(yùn)行內(nèi)存.
假如閱讀文章PHP的有關(guān)編碼, 能夠見(jiàn)到這兩個(gè)涵數(shù)的完成上的不同點(diǎn):
2個(gè)涵數(shù)都啟用了php_mysql_do_query(), 只差了第2個(gè)主要參數(shù)的不一樣, MYSQL_STORE_RESULT和MYSQL_USE_RESULT. 再看php_mysql_do_query()的完成:
mysql_use_result()和mysql_store_result()是MySQL的C API函數(shù), 這兩個(gè)C API函數(shù)的差別便是后面一種把結(jié)果集從MySQL Server端所有載入來(lái)到Client端, 前面一種僅僅載入了結(jié)果集的元信息內(nèi)容.
返回PHP, 應(yīng)用mysql_unbuffered_query(), 能夠防止運(yùn)行內(nèi)存的馬上占有. 假如在解析xml的全過(guò)程不對(duì)結(jié)果開(kāi)展”PHP緩存文件”(如放進(jìn)某數(shù)字能量數(shù)組中), 則全部實(shí)行全過(guò)程盡管實(shí)際操作了十萬(wàn)條或是百萬(wàn)條或是大量的數(shù)據(jù)信息, 但PHP占有的運(yùn)行內(nèi)存自始至終是十分小的.
標(biāo)識(shí):北京市網(wǎng)站制作 高檔網(wǎng)站建設(shè)
留下聯(lián)系方式,我們將會(huì)在一個(gè)工作日內(nèi)與你聯(lián)系