你檢查,如果連接通過爲使用連接的代碼失敗跌倒。顯然,這不會工作,因爲它不是一個活的連接。確保連接失敗,沒有達到依賴它的代碼。 (請注意,我並不需要主張使用退出或死亡,它們可能會造成非常糟糕的用戶體驗,它們可能很有用,但理想情況下,您應該輸出更好的消息,併爲日誌留下難看的錯誤信息[除非您'只測試或者它是一個命令行腳本])。
至於接近()(這實際上是一個別名免費()):
free()的基本上所有解除分配的附着導致的東西。你需要明白,有兩個(簡化,但與它一起)檢索行的方式:
緩衝 - 一切都被搶走。換句話說,當你開始循環記錄時,它們實際上已經在記憶中了。他們是緩衝。每次您調用fetch()時,它們都不會從服務器上被拉出,而是從內存中被拉出。
非緩衝 - 可能有一個小緩衝區,但基本上每次調用fetch()時,PHP都必須從數據庫中提取新行。在循環開始時,他們並不都坐在記憶中。
有趣的是:num_rows()可以非常有效地在緩衝查詢上調用,因爲所有的行都已經被拉動(儘管你不應該拉所有的行來計算它們 - 這就是COUNT的目的)。非緩衝查詢在拉出所有行之前不能執行num_rows()。這意味着它可能是一個錯誤,或者基本上將它變成緩衝查詢。
總之,回到你的實際問題:
免費()釋放與結果對象相關的任何事情。在緩衝查詢的情況下,這是任何坐在內存中的行。在非緩衝查詢的情況下,free()將釋放可能位於內存中的任何行,然後取消請求的其餘部分。基本上它的PHP告訴MySQL,「嘿,你知道我請求的所有行嗎?改變了我的想法,你可以放棄這個請求。」
至於如果你應該釋放結果......那麼,只要變量超出了範圍*,它就會發生。但是,明確地做這件事並沒有什麼壞處,並且在查詢可能使用大量內存,然後在可能使用大量內存的情況下執行另一個查詢的情況下,您可能希望釋放這些設置以保持內存使用率低。
*或者當請求結束時。我不記得我的頭頂。
自從我使用MySQLi以來,已經很長時間了,但似乎query()返回一個boolean或mysqli_result對象。而且似乎mysqli_result沒有close()方法?你的意思是免費()? – Corbin 2012-03-09 06:44:12
看例子http://in.php.net/manual/en/mysqli.query.php – aWebDeveloper 2012-03-09 06:44:56
啊,http://www.php.net/manual/en/class.mysqli-result.php沒有列出它,但free()頁面列出了close()作爲別名。回答如下。 – Corbin 2012-03-09 06:47:50