PHPを使用してMySQLデータベースを操作する場合、多くの開発者はMySQLI拡張機能を使用してデータベース操作を実行することに慣れています。ただし、多くの人は1つの詳細を無視しています。クエリの後です。あなたは尋ねるかもしれません、 $ result-> free() (またはmysqli_free_result() )は本当に重要ですか?なぜ省略できないのですか?この記事については詳細に説明します。
mysqli_query()を使用してクエリステートメントを実行する場合、たとえば:
$mysqli = new mysqli("localhost", "username", "password", "database");
$result = $mysqli->query("SELECT * FROM users");
ここでの$の結果は、クエリによって返されるすべてのデータを保存するmysqli_resultオブジェクトです。特にクエリの結果が大きい場合、メモリリソースが消費されます。メモリ消費量は大幅に増加します。
多くの人々は、PHPが自動的にメモリを管理し、スクリプトが終了すると変数を自動的にクリーンアップすると考えています。しかし、事実は次のとおりです。
?スクリプトが終了すると、メモリは自動的にクリーニングされます。
?ただし、スクリプトの実行中、複数のクエリまたは大きなクエリがあり、それらを積極的にリリースしない場合、メモリ圧力はますます大きくなります。
例えば:
for ($i = 0; $i < 1000; $i++) {
$result = $mysqli->query("SELECT * FROM big_table");
// 結果セットはリリースされません
}
上記のコードでは、各ループは結果セットオブジェクトを生成しますが、リリースされません。これにより、メモリが上昇し続けるため、最終的にはメモリオーバーフローやパフォーマンスが大幅に低下する可能性があります。
$ result-> free()を追加すると:
for ($i = 0; $i < 1000; $i++) {
$result = $mysqli->query("SELECT * FROM big_table");
$result->free();
}
このようにして、各ループの最後に、結果セットが占めるメモリが時間内にリリースされ、メモリの使用量が大幅に削減されます。
2つの方法があります。
1 ??オブジェクト指向のスタイル:
$result = $mysqli->query("SELECT * FROM users");
if ($result) {
// 処理結果...
$result->free();
}
2 ??プロセススタイル:
$result = mysqli_query($mysqli, "SELECT * FROM users");
if ($result) {
// 処理結果...
mysqli_free_result($result);
}
注:クエリが失敗した場合( falseを返す)、 free()を呼び出すとエラーが報告されるため、最初に$ resultが有効なオブジェクトであるかどうかを判断する必要があります。
短いスクリプトと単一のクエリで違いを感じることはないかもしれません。ただし、これらのシナリオでは、結果セットをリリースしないことに深刻な結果があります。
ビッグデータクエリ:数万または数十万行を照会すると、結果セットは多くのメモリを占有します。
長期にわたるスクリプト:時限タスク、クローラー、デーモンなど。
高い並行Webサービス:各要求はメモリを消費し、長い間サーバーをドラッグします。
これらの場合、結果セットはリリースされず、少なくともアプリケーションを遅くすることができ、サーバーは最悪の場合にクラッシュする可能性があります。
1つの文を覚えておいてください:使用済みリソースは手動でリリースする必要があります!
PHPが自動的にメモリをリサイクルする場合でも、実行中のリソースを管理するために頼ってはいけません。
実際の開発では、良い習慣を開発する - $ result-> free()は、「正しい」コードを書くだけでなく、「良い」コードを書くだけでなく、クエリ後にタイムリーです。