2012-03-09 71 views
3

關閉結果我們爲什麼要關閉$結果爲什麼我們的mysqli

$mysqli = new mysqli("localhost", "root", "root", "test"); 
    if ($mysqli->connect_errno) { 
     echo "Failed to connect to MySQL: " . $mysqli->connect_error; 
    } 

    if ($result = $mysqli->query("Select * from user")) { 
     while ($row = $result->fetch_object()) 
     { 
      //var_dump($row); 
     } 
     $result->close(); 
    } 
+0

自從我使用MySQLi以來,已經很長時間了,但似乎query()返回一個boolean或mysqli_result對象。而且似乎mysqli_result沒有close()方法?你的意思是免費()? – Corbin 2012-03-09 06:44:12

+0

看例子http://in.php.net/manual/en/mysqli.query.php – aWebDeveloper 2012-03-09 06:44:56

+0

啊,http://www.php.net/manual/en/class.mysqli-result.php沒有列出它,但free()頁面列出了close()作爲別名。回答如下。 – Corbin 2012-03-09 06:47:50

回答

4

你檢查,如果連接通過爲使用連接的代碼失敗跌倒。顯然,這不會工作,因爲它不是一個活的連接。確保連接失敗,沒有達到依賴它的代碼。 (請注意,我並不需要主張使用退出或死亡,它們可能會造成非常糟糕的用戶體驗,它們可能很有用,但理想情況下,您應該輸出更好的消息,併爲日誌留下難看的錯誤信息[除非您'只測試或者它是一個命令行腳本])。

至於接近()(這實際上是一個別名免費()):

free()的基本上所有解除分配的附着導致的東西。你需要明白,有兩個(簡化,但與它一起)檢索行的方式:

緩衝 - 一切都被搶走。換句話說,當你開始循環記錄時,它們實際上已經在記憶中了。他們是緩衝。每次您調用fetch()時,它們都不會從服務器上被拉出,而是從內存中被拉出。

非緩衝 - 可能有一個小緩衝區,但基本上每次調用fetch()時,PHP都必須從數據庫中提取新行。在循環開始時,他們並不都坐在記憶中。

有趣的是:num_rows()可以非常有效地在緩衝查詢上調用,因爲所有的行都已經被拉動(儘管你不應該拉所有的行來計算它們 - 這就是COUNT的目的)。非緩衝查詢在拉出所有行之前不能執行num_rows()。這意味着它可能是一個錯誤,或者基本上將它變成緩衝查詢。

總之,回到你的實際問題:

免費()釋放與結果對象相關的任何事情。在緩衝查詢的情況下,這是任何坐在內存中的行。在非緩衝查詢的情況下,free()將釋放可能位於內存中的任何行,然後取消請求的其餘部分。基本上它的PHP告訴MySQL,「嘿,你知道我請求的所有行嗎?改變了我的想法,你可以放棄這個請求。」

至於如果你應該釋放結果......那麼,只要變量超出了範圍*,它就會發生。但是,明確地做這件事並沒有什麼壞處,並且在查詢可能使用大量內存,然後在可能使用大量內存的情況下執行另一個查詢的情況下,您可能希望釋放這些設置以保持內存使用率低。

*或者當請求結束時。我不記得我的頭頂。

+0

更快,你只需要在'select'語句上使用' - > close()'對嗎?而不是像'insert'或'update'這樣的其他東西,因爲它們不會返回任何東西? – 2012-07-17 10:11:28

+0

@AndyLobel我相信你是對的。我並不積極,但由於沒有插入/更新/等的結果集,應該沒有任何東西可以空閒。 – Corbin 2012-07-18 06:03:25