25

準備されたmysqliステートメントをファイナライズするときの$stmt->close()$stmt->free_result()の違いを明確にしようとしています。


これまでのところ、私は使用しています:

$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();

では、どのような状況で、どのような理由で何を選択すればよいのでしょうか?

4

2 に答える 2

41

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

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

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

于 2013-10-23T01:57:40.110 に答える
4

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

mysqli::close 準備済みステートメントを閉じます。

利用可能な合計接続数は限られているため、使い終わったらすぐにリソースを解放することをお勧めします。

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

リソースが不要になった場合は、リソースを明示的に解放することをお勧めします。同時に多くのリクエストが行われたときに、サーバーに大きな負荷がかかるのを避けることができます。

どちらも厳密に呼び出す必要があるわけではなく、両方を使用することをお勧めします。

于 2013-10-23T01:57:47.400 に答える