2013-10-23 4 views
14

準備を最終決定するとき、私は$ stmt->近い()$ stmt-> free_result()との違いを明確にしようとしていますmysqliステートメント。


これまでのところ、私が使用します。

$mysqli = new mysqli(host,user,password,database); 
$stmt = $mysqli->prepare(sql statement); 
[...] 
$stmt->free_result(); 
$mysqli->close(); 

、すべてが正常に動作するようです。

しかし、多くのプログラマーが$ stmt-> free_result()の代わりに$ stmt-> closeを使用しているのを見てきました。かつて私は両方を見たことがあります:

$stmt->free_result(); 
$stmt->close(); 
$mysqli->close(); 

どのような状況で、私は何を選ぶべきですか、なぜですか?

答えて

22

$stmt->free_result()は、結果セットに関連するメモリを解放しますが、$stmt->close()は、プリペアドステートメントに関連するメモリを解放します。その後、$stmt->close()を呼び出すと、まだ残っている結果はすべてキャンセルされます。

本質的には、$stmt->close()を呼び出すと、$stmt->free_result()を呼び出すのと同じ効果が得られます。これは結果セットもキャンセルするためです。しかし、$stmt->free_result()を呼び出すと、準備されたステートメントで使用されているメモリがクリアされず、その場合は$stmt->close()を使用する必要があります。

あなたが初期化した準備済みのステートメントを使用しようとしているが、現在持っている結果セットを必要としない状況があります。そのような場合は、準備されたステートメントを完了するまで$stmt->close()を呼び出し、別のステートメントを実行する前に$stmt->free_result()を呼び出すまで待つことになります。

+0

理想的な説明! – neophyte

2

PHPは、接続が終了し、実行が終了した後にリソースを解放します。

mysqli::close準備文を閉じます。

利用可能な接続の数は限られていますので、2番目のリソースを解放することをお勧めします。

そして

mysqli_stmt::free_resultは、指定したステートメントハンドルの結果を格納したメモリを解放します。

リソースが不要になったときにリソースを明示的に解放することをお勧めします。多くの要求が同時に発生した場合にサーバーに負荷がかかることを避けることができます。

どちらも厳密には呼び出す必要はありませんが、両方を使用することをお勧めします。