PHP開発では、 fetch_object関数を使用して、データベースからオブジェクトの形式に設定された結果を取得することが非常に一般的です。開発者はオブジェクト指向の方法でデータを操作できるようになり、コード構造はより明確になります。ただし、高い並行性または長期にわたるスクリプトでは、 fetch_objectによって返されたオブジェクトリソースが適切に管理されていない場合、メモリリークを引き起こすのは簡単で、最終的にシステムのパフォーマンスに影響を与え、クラッシュを引き起こします。
この記事は、 FETCH_OBJECTの実用的な原則から始まり、メモリリークの原因を詳細に分析し、より堅牢で効率的なPHPコードを作成するのに役立つ実用的なメモリ管理スキルを提供します。
fetch_objectは、phpのmysqli_resultクラスの方法の1つであり、結果セットのレコードをオブジェクトに変換するために使用されます。例は次のとおりです。
$mysqli = new mysqli("m66.net", "user", "password", "database");
$result = $mysqli->query("SELECT * FROM users");
while ($obj = $result->fetch_object()) {
echo $obj->username . "<br>";
}
ここでは、 fetch_objectが呼び出されるたびに、新しいオブジェクトインスタンスが返され、現在の行のデータが保持されます。
結果は、時間内にリリースされていないリソースを設定しました<BR> クエリの結果が長い間リリースされていない場合、 mysqli_resultは多くのメモリを占有します。 PHPスクリプトは、最後の終わりに自動的にクリーンアップされますが、長いスクリプトまたはDaemonsで手動でリリースする必要があります。
多数のオブジェクトがループで作成され、時間内に破壊されませんでした
fetch_objectは新しいオブジェクトを継続的に作成し、これらのオブジェクトが外部から参照されるか、配列に保存されていてクリーニングされていない場合、メモリは成長し続けます。
複雑なオブジェクト参照により、メモリがリサイクルされます<br> Fetchによって取得されたオブジェクトには、他の大規模なリソースを参照する属性、またはオブジェクトが互いに参照する属性が含まれている場合、PHPガベージコレクションメカニズムを時間内にリサイクルできないため、メモリの蓄積が生じます。
クエリが完了したら、 $ result-> free()に電話してリソースをリリースして、継続的なメモリ消費を避けます。
$result = $mysqli->query("SELECT * FROM users");
while ($obj = $result->fetch_object()) {
// データの処理
}
$result->free();
fetch_objectの結果を配列に保存する場合、処理後、配列を明示的にクリアします。
$objects = [];
while ($obj = $result->fetch_object()) {
$objects[] = $obj;
}
// すべてのオブジェクトを処理します
unset($objects);
$result->free();
これにより、PHPがメモリをより速くリサイクルするのに役立ちます。
オブジェクトを長時間保存する必要がない場合は、オブジェクトの蓄積を避けるために、ループで処理した後に参照をリリースしてみてください。
メモリ圧力が高い場合は、代わりにfetch_assoc()を使用できます。オブジェクトの代わりに配列を返し、メモリの使用量を削減できます。
while ($row = $result->fetch_assoc()) {
// 配列を使用してデータにアクセスします
}
コードスタイルは異なりますが、メモリに優しいです。
<?php
$mysqli = new mysqli("m66.net", "user", "password", "database");
if ($mysqli->connect_error) {
die("接続に失敗しました:" . $mysqli->connect_error);
}
$result = $mysqli->query("SELECT * FROM users");
if ($result) {
while ($obj = $result->fetch_object()) {
echo "ユーザー名: " . $obj->username . "<br>";
// 処理後に保存されていない場合,変数を直接リリースします
unset($obj);
}
// 結果セットをリリースします
$result->free();
} else {
echo "クエリに失敗しました:" . $mysqli->error;
}
$mysqli->close();
?>
fetch_objectはデータの操作に便利ですが、多数のオブジェクトを作成するとメモリ圧力がかかります。
メモリの漏れを防ぐために、結果セットをリリースし、オブジェクトを破壊する習慣を開発する必要があります。
FETCH_ASSOCと適切なメモリ管理ポリシーを組み合わせて、PHPスクリプトのメモリ使用法を効果的に制御できます。
長期にわたるスクリプトについては、メモリの監視と管理に特に注意してください。
上記のスキルを習得すると、大量のデータを処理する際にPHPプログラムがより安定して効率的になり、メモリリークによって引き起こされるパフォーマンスボトルネックを回避できます。