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