In PHP 7.4 habe ich festgestellt, dass die Anzahl der von gc_collect_cycles zurückgegebenen gesammelten Zyklen immer Null ist, wenn es eine destructor
Methode in einem zyklisch referenzierten Objekt gibt.
class A {
public function __destruct() {
}
}
gc_disable();
$a1 = new A;
$a2 = new A;
$a1->ref = $a2;
$a2->ref = $a1;
$a1 = $a2 = NULL;
echo('removed cycles: '.gc_collect_cycles()); // Output: removed cycles: 0
Wenn ich die __destruct
Methode entferne, lautet die Ausgabe:
removed cycles: 2
Sie können sehen, dass dieses Verhalten ab PHP 7.4.0beta4 gestartet wurde
Was geht hier vor sich ? Werden Müllzyklen im Destruktor gesammelt, auch wenn GC deaktiviert ist?
Seit PHP 7.4 ruft der erste Speicherbereinigungslauf nur Destruktoren für Objekte auf, über die sie verfügen, und die tatsächliche Zerstörung des Objekts wird auf den nächsten GC-Lauf verschoben. Sie können dies sehen, wenn Sie zwei Aufrufe von gc_collect_cycles () ausführen: https://3v4l.org/0LIVn
Der Grund für dieses Verhalten ist, dass Destruktoren zusätzliche Verweise auf das Objekt einfügen können, sodass es nicht mehr gültig ist, es zu zerstören. Frühere Versionen verwendeten eine unzuverlässige Heuristik, um diesen Fall zu erkennen. PHP 7.4 verzögert stattdessen die Zerstörung auf einen separaten GC-Lauf.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다