2017-08-12 1 views
1

Ich habe Probleme, meinen Kopf um einige objektorientierte Programmierkonzepte zu wickeln (ich komme aus JavaScript Land). Ich schreibe ein Wordpress-Plugin, und eine sehr kleine Teilmenge des gesamten Plugins ist die Erstellung einer Sitemap für eine n Liste von Blog-Posts.Werden Objekte im Speicher entfernt, nachdem sie verwendet wurden?

Diese Funktion wird ausgeführt, wenn jemand das Plugin im Haupt-Dashboard aktiviert.

Hier ist eine vereinfachte Version der Klasse, nur damit Sie sehen können, wie es strukturiert ist. Es ist nicht wirklich wichtig zu verstehen, wie der Code in ihm funktioniert, aber ich werde ihn einbeziehen, um einen besseren Überblick darüber zu geben, woran ich gerade arbeite.

class SitemapGenerator { 

    public function create_posts_sitemap() { 
     $header_xml = '<?xml version="1.0" encoding="UTF-8"?>'; 
     $header_xml .= "\n"; 
     $header_xml .= '<urlset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd" xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">'; 
     $header_xml .= "\n\n"; 

     $posts_xml = $header_xml; 

     foreach($this->posts as $post) { 
      $posts_xml .= "<url>\n"; 
      $posts_xml .= "\t<loc>\t\n"; 
      $posts_xml .= "\t\t" . esc_url(get_permalink($post)); 
      $posts_xml .= "\n\t</loc>\t"; 
      $posts_xml .= "\n</url>\n\n"; 
     } 
     $posts_xml .= "</urlset>"; 
     $this->write_to_file('sitemap_posts', $posts_xml); 
    } 

    private function write_to_file($filename, $contents) { 
     $file = get_home_path() . "/$filename.xml"; 
     $open = fopen($file, "a"); 
     ftruncate($open, 0); 
     fputs($open, $contents); 
     fclose($open); 
    } 
} 

Meine Frage ist, sind Instanzen von Objekten aus dem Speicher entfernt, nachdem sie verwendet werden? Wie Sie sehen können, generiert all diese Klasse eine Sitemap und muss nicht direkt nach der Ausführung im Speicher vorhanden sein. Ich frage mich auch, ob ich sogar eine Klasse verwenden muss, um diese Funktionalität auszuführen (nicht in der Antwort erforderlich, aber wenn Sie das auch noch erläutern könnten, wäre das großartig).

Ich habe Probleme, meinen Kopf um das Konzept zu wickeln, da der PHP-Code auf einem Server sitzt und ich mehr daran gewöhnt bin, mit Dingen in der Browserumgebung zu arbeiten.

+2

Haben Sie in Garbage Collection in PHP gelesen? http://php.net/manual/en/features.gc.php – RamRaider

+0

Wird dies einen Blick geben. Definitiv ein wenig über meinen Kopf, wie sie es erklären, aber vielleicht kann ich andere Tutorials online über Garbage Collection finden. –

+0

Ich fand einen anderen Artikel, der sagt, dass wenn ein Aktionsbereich endet, alles darin zerstört wird. Wenn das der Fall ist, dann wird, sobald die Funktion zum Schreiben in Datei in der Instanz der Klasse beendet ist, der gesamte von der Funktion activate belegte Speicher zerstört. Ist das richtig? –

Antwort

1

@RamRaider ist korrekt und hat die entsprechende Referenz zur Verfügung gestellt. Aber in kurzen Worten:

In Javascript landen, ist ein Benutzer (im Grunde genommen) eine Sache auf einem Computer.

In PHP Land, eine Bazillion Benutzer machen eine Vielzahl von Dingen auf (im Grunde) einen Computer.

Folglich ist In-Situ-Speicherbereinigung problematisch. Sie würden überrascht sein, wie etwas scheinbar Einfaches reibungslosen Operationen im Wege steht. In der Realität skaliert das Speichermanagement jedoch nicht gut.

Was PHP tut ist Speicher für Sie zu verwalten. Bis zu einem gewissen Grad können Sie es ignorieren. Es gibt Variablen, die das kontrollieren, aber im Grunde wird jedes Mal, wenn ein PHP-Skript ausgeführt wird, PHP den "Garbage Collector" abfeuern, um die Trümmer, die frühere Skripte zurückgelassen haben, zu beseitigen. Die Engine arbeitet daran, Dinge sowohl während der Ausführung als auch während der Ausführung zu zerstören, aber sie schwitzt nicht die kleinen Dinge. Tatsächlich bietet die Lösung tatsächlich ein wesentlich besseres Speichermanagement, da mehr als nur die Ausführung berücksichtigt wird, wenn alles aus gerichtet wird.

Also, die einfachste Antwort auf Ihre Frage ist "Ja".

+0

Süß. Das funktioniert. Ziemlich einfache Frage, aber ich sorge mich über Speicherlecks und dergleichen. Vielen Dank. –

Verwandte Themen