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