Was ist der Umfang der kreisförmigen Referenz Problem PHP und sollte ich darüber Sorgen machen?

StackOverflow https://stackoverflow.com/questions/530179

Frage

Wenn ich eine Baumstruktur von Knoten ähnlich den folgenden Code verwende, kann ich über den Kreis Bezug zu kümmern?
Ich habe gelesen, dass PHP einen Speicherzuordnungsmechanismus verwendet, die das Leben sehr schwer für den Garbage Collector machen können, wenn es zirkuläre Referenzen beteiligt.

Was ich wissen möchte, ist:

  • Wenn mein Baum von nur wenigen Knoten besteht, sagen 25, ist das ein Problem?
  • Wird der Speicher am Ende des Skripts befreit werden oder bin ich langsam ein Problem für den Server zu erstellen?
  • Unter welchen Umständen wird dieses Problem eine Wirkung während der Skriptausführung haben?
  • Wird zerstören manuell die Verweise das Problem zu lösen und sollte ich tun es immer?
class Node {
    private $parent;
    private $children;

    function addChild( Node $child ) {
        $this->children[] = $child;
        $child->setParent( $this );
    }

    function setParent( $parent ) {
        $this->parent = $parent;
    }
}

//eg
$node0 = new Node;
$node1 = new Node;

// nodes 1 and 2 have a circular reference to each other
$node0->addChild( $node1 );
War es hilfreich?

Lösung

Punkt für Punkt:

  
      
  • Wenn mein Baum von nur wenigen Knoten besteht, sagen 25, ist das ein Problem?
  •   

Nicht, wenn die Knoten sind echte Monster.

  
      
  • Wird der Speicher am Ende des Skripts befreit werden oder bin ich langsam ein Problem für den Server zu erstellen?
  •   

Wenn der Interpreter abschaltet gesamte Speicher wird freigegeben.

  
      
  • Unter welchen Umständen wird dieses Problem eine Wirkung während der Skriptausführung haben?
  •   

Ich bezweifle, dass Sie etwas zu befürchten haben, wenn Sie sehr niedrigen Speichergrenzen haben oder sehr große dynamische Datenstrukturen. Wenn Sie 25 Knoten haben, die häufig nicht werden erstellt / befreit sind, werden Sie kein Problem haben.

  
      
  • Wird zerstören manuell die Verweise das Problem zu lösen und sollte ich tun es immer?
  •   

Es wird Ihnen helfen. Wenn eine große Datenmenge in unsere Datenbank mit Propel Läden liefen wir in eine Menge Probleme mit dem Speicherverbrauch, die wir zirkuläre Referenzen verfolgen nicht freigegeben werden. Unsere Lösung war es, ein Verfahren zu nennen, die alle Verweise gelöscht.

Andere Tipps

Vielleicht ja, aber da es alle Objekte am Ende jeder Anfrage wirft (es sei denn, Sie Caching), ich glaube nicht, viele PHP-Programmierer zu kümmern.

Wenn Sie Befehlszeile-Skripte in PHP schreiben, dann vielleicht haben Sie einen Fall bekommen für darüber Sorgen, aber man müßte einig ziemlich gewundenen PHP-Code zu schreiben, bevor es etwas Mühe wert wird. Und wenn das der Fall ist haben Sie größere Probleme.

Viel Glück.

die Natur der meisten PHP-Seiten gegeben - das heißt, läuft der Prozess für eine Webseite und geworfen wird bei Fertigstellung entfernt - ich eher bezweifeln dies ein Problem ist. Ich habe keine Probleme mit zirkulären Referenzen gesehen und habe sie ohne Probleme. Nach meiner Erfahrung werden Sie in mehr Probleme mit bloßem Speicherverbrauch laufen, aber PHP 5, dass etwas, es wäre denn durch eine Verschiebung weg von nur Kopieren von Objekten und Arrays anders gesagt gemildert hat.

PHP 5.3 wird zirkuläre Referenz-Erkennung und Zerstörung Merkmale umfassen. Es ist eine optionale Einstellung, und es sollte nur verwendet werden, wenn notwendig, da die Garbage Collector Performance-Einbußen nehmen, aber es ist maßgeschneidert für Ihr Beispiel.

jetzt entwickelt, nehmen vorsorglich ausdrücklich dereferenzieren in einem __destruct () -Methode, und ein Upgrade auf 5.3, wenn möglich.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top