2

変数の使用を最小限に抑える習慣があります。したがって、次のことによって得られる利点があるかどうか疑問に思っています。

$query = $mysqli->query('SELECT * FROM `people` ORDER BY `name` ASC LIMIT 0,30');

// Example 1
$query = $query->fetch_assoc();

// Example 2
$query_r = $query->fetch_assoc();
$query->free();

私が正しければ、例1は、関連付けられているメモリを解放する必要がある再割り当て時に、そのままより効率的であるはずです$query。ただし、関連付けられたメモリを解放するunsetメソッド ( ) があります。これは同じことですか?MySQLi_Result::free()

::free()結果に関連付けられたメモリを解放するために呼び出さずunsetに、変数を再割り当てすることで同じことをしているのですか? この種のことをログに記録する方法がわかりません - 誰かアイデアがありますか?

4

2 に答える 2

5

マニュアルfree()、メモリを解放するためにまだ使用する必要があることを示唆しているようです。その理由は、PHP ではなくMySQLfree()でメモリを解放していることだと思います。PHP は MySQL のガベージ コレクションを実行できないため、 を呼び出す必要があります。free()

于 2008-08-25T18:08:38.373 に答える
3

例 1は、$query 変数を MySQL の結果から分離します。MySQL の結果は引き続きメモリに存在し、ガベージ コレクションが発生するまで存在し続け、メモリを浪費します。

例 2では、MySQL の結果をすぐに解放し、使用済みのリソースを解放します。

ただし、PHP ページは通常、小さな結果セットで存続期間が短いため、節約されるメモリはわずかです。長時間実行されるページで大量の結果を長期間にわたってメモリに残さない限り、速度の低下に気付くことはありません。

ブライアン、PHPは MySQL の結果をガベージ コレクションできますが、すぐには実行されません。結果は、MySQL サーバーではなく、PHP のメモリ プールに保存されます。

(バッファリングされていないクエリを使用する場合のメモリの局所性はわずかに異なりますが、言及する価値がないほど PHP ではめったに使用されません)

于 2008-08-28T09:29:55.973 に答える