PHPのゴミ収集メカニズムでは、 GC_MEM_CACHESとGC_COLLECT_CYCLESは2つの非常に重要な機能です。それらを合理的に使用すると、メモリリサイクル効率を大幅に改善し、メモリリークリスクを減らし、プログラムのパフォーマンスを最適化できます。この記事では、これら2つの機能と組み合わせてメモリ管理を実装するための機能、使用方法、およびベストプラクティスを詳細に紹介します。
PHPでは、Garbage Collection(GC)は、メモリの漏れを防ぐためにもはや言及されていない変数とオブジェクトを自動的にリサイクルする責任があります。 PHPは参照カウントメカニズムを介して変数を追跡しますが、循環参照(2つ以上のオブジェクトが互いを参照)の場合、単純な参照カウントをリサイクルできず、ゴミ収集メカニズムが必要です。
GC_COLLECT_CYCLES()は、ガベージコレクションを積極的にトリガーするPHPによって提供される関数です。円形の参照によって生成されたすべてのガベージをスキャンしてリサイクルします。
すべての円形の参照メモリをリサイクルしようとして、完全なごみ収集サイクルを実行します。
リサイクルされたループの数を返します。
<?php
// 円形の参照例を作成します
class A {
public $b;
}
class B {
public $a;
}
$a = new A();
$b = new B();
$a->b = $b;
$b->a = $a;
// ガベージコレクションを積極的にトリガーします
$collected = gc_collect_cycles();
echo "リサイクル $collected 参照メモリ\n";
?>
GC_MEM_CACHES()関数は、ガベージコレクション内のキャッシュをクリーンアップしてメモリを解放するために使用されます。これらのキャッシュは通常、ゴミ収集中に生成される一時的なデータ構造です。
ガベージコレクターの内部キャッシュをクリーンアップし、余分なメモリを解放します。
リサイクル参照は積極的にリサイクルされず、キャッシュされたデータのみがリリースされます。
<?php
// 掃除 GC キャッシュ,無料のメモリ
gc_mem_caches();
echo "已掃除垃圾回收キャッシュ\n";
?>
PHPスクリプトの実行では、 GC_COLLECT_CYCLES()を呼び出すだけで、円形の参照メモリをリサイクルできますが、ガベージコレクションキャッシュはまだ存在し、余分なメモリを取り上げます。この時点で、 GC_MEM_CACHES()がすぐに呼び出された場合、これらのキャッシュをリリースしてメモリの使用量をさらに減らすことができます。
<?php
// ゴミコレクションをトリガーします
$collected = gc_collect_cycles();
echo "リサイクル $collected リサイクルリファレンス\n";
// 掃除 GC キャッシュ,余分なメモリを解放します
gc_mem_caches();
echo "垃圾回收キャッシュ已掃除\n";
?>
たとえば、長期にわたるPHPスクリプト(Daemons、CLIスクリプト、タスクキューワーカーなど)は、メモリの使用量が高く、循環参照が発生しやすいです。これら2つの機能を定期的かつ積極的に呼び出すことをお勧めします。
例:
<?php
while (true) {
// ビジネスロジックをシミュレートします
do_something();
// 定期进行垃圾回收和キャッシュ掃除
$collected = gc_collect_cycles();
gc_mem_caches();
echo "リサイクル $collected リサイクルリファレンス,キャッシュ已掃除\n";
// 寝る,過度の使用を防ぎます CPU
sleep(10);
}
?>
GC_COLLECT_CYCLES()は、参照されるメモリをリサイクルするために使用されます。
GC_MEM_CACHES()は、ガベージコレクターの内部キャッシュをクリーンアップするために使用されます。
組み合わせで使用すると、より効果的にメモリを自由に解放し、メモリの漏れと膨満感を減らすことができます。
長期にわたるスクリプトでは、これらの2つの関数を合理的に呼び出すことで、メモリを安定させるのに役立ちます。
これら2つの機能をマスターして正しく使用すると、PHPプログラムのメモリ回復効率を大幅に改善し、アプリケーションのパフォーマンスと安定性を確保できます。
PHPガベージコレクションメカニズムについて詳しく知りたい場合は、次のことをご覧ください。
https://gitbox.net/manual/en/function.gc-collect-cycles.php
https://gitbox.net/manual/en/function.gc-mem-caches.php