Ich habe mir den Speicherverbrauch in Wordpress genau angesehen. Auf meiner Website werden anscheinend für jeden Seitenaufruf 20 MB RAM zugewiesen, um eine komfortable Umgebung für die Ausführung aller Plugins vorzubereiten. Ich habe es folgendermaßen dargestellt:
Es gibt keinen einzigen zu optimierenden Punkt, keinen einzigen Bösewicht, der den größten Teil des Gedächtnisses aufnimmt. Der Verbrauch ist auf viele, viele PHP-Module verteilt.
Wie kann Wordpress veranlasst werden, seine Umgebung nur einmal im Speicher zu initialisieren und sie dann für jeden Treffer mehrmals zu verwenden? Ich möchte nicht, dass langsames PHP bei jedem Klick 20 MB frisst - selbst auf einem Server mit viel Arbeitsspeicher dauert es Sekunden, bis all diese Arbeit erledigt ist. Grundsätzlich benötigen Sie schreibgeschützte Speicherbereiche, die wiederverwendet werden können.
Also ... warum 20MB? Kann mir jemand einen Einblick geben?
Bearbeiten: Hier ist die WinCacheGrind-Ausgabe in Wordpress, die auf meinem Entwicklungscomputer ausgeführt wird (viel schneller als das gemeinsam genutzte Hosting). Wie Sie sehen, dauert es mehr als eine Sekunde, bis das HTML der Hauptseite erstellt ist. Verlangsamen Sie das durch Shared Hosting und Sie haben ein Rezept für Probleme. Ich habe die Methode gewählt, die die meiste Zeit in Anspruch nimmt. Wie würden Sie dies optimieren?
Bearbeiten: Hier sind Abfragestatistiken von diesem fantastischen functions.php Profiling Tool .
Laden: 12 Abfragen - 532 ms - 19,1 MB - 43 Cache-Treffer / 53 Abfrage: 15 Abfragen - 563 ms - 19,0 MB - 72 Cache-Treffer / 86 Anzeige: 21 Abfragen - 705 ms - 19,2 MB - 234 Cache-Treffer / 257
Edit: Willst du etwas sehen, das dich garantiert ausflippt? Fügen Sie diese Zeilen am Ende von index.php ein:
echo "<pre>\n";
print_r(get_defined_vars());
echo "</pre>\n";
Ich habe versucht zu zählen, wie oft der Körper des aktuellen Posts im Speicher gespeichert ist. Ich habe 20 Fälle gezählt. Dann wurde mir klar, dass PHP über eine Referenzzählung verfügt, sodass die Anzahl der Kopien auf drei reduziert wurde: Zwei scheinen sich in WP_Query zu befinden, eine im Objektcache. Ich recherchiere weiter.
Aus diesem Grund denke ich, dass WordPress überarbeitet werden muss, um die Speicherprobleme in den Griff zu bekommen. Sie können den Speicherverbrauch nicht länger auf die Komplexität seiner Funktionen zurückführen. Es macht einfach eine Menge Dinge falsch .
Edit: Nach einem Tag, um dies herauszufinden, sind hier meine Ergebnisse:
1) 88% des gesamten Speichers stammen aus Aufrufen des Typs require oder include oder include_once:
2) Die PHP-Datei enthält Informationen, die meistens während des ersten Teils der Bearbeitung einer Anfrage auftreten (nicht überraschend). Hier wird auch der gesamte Speicher aufgebraucht:
3) Es ist sehr interessant, alle Funktionen aufzuzeichnen, die während einer Anfrage ausgeführt werden. Insgesamt gibt es über 12000 Anrufe. Ich habe sie gezittert, um es sichtbarer zu machen (die Level-Achse ist im Grunde die Tiefe des Stapels):
4) Der einzige Weg, den ich mir vorstellen kann, besteht darin, die Anzahl der enthaltenen .php-Dateien zu minimieren. Wenn ich die Funktionen nach Dateien aufteile, aus denen sie stammen, können Sie feststellen, dass viele Dateien höchstens ein- oder zweimal aufgerufen werden. Wir brauchen eine Möglichkeit, diese zu überspringen, wenn sie nicht benötigt werden. Zum Beispiel wird mein Remote-Datenbank-Backup-Plugin geladen und registriert, nur um überhaupt nicht verwendet zu werden. Hier ist der obige Plot nach Dateinamen aufgeteilt:
Ich biete ein Kopfgeld an, das allen meinen Ruf wert ist :) für Umgestaltungen, die dazu führen würden, dass sich der Speicherbedarf meines Blogs um 30% oder mehr verringert.
Edit: Ich habe WP 3.1 installiert, hier ist ein Vergleich mit der alten Version.
Blau ist WP 3.1, Rot ist 3.0.4. Das neue WP ist schneller, verbraucht aber auch mehr Speicher.
Hier ist eine Liste nach Include-Datei.
Dies ließ mich erkennen, wie viel Speicher von "All In One SEO Pack" verbraucht wird - eine Möglichkeit wäre, nur einen Bruchteil der Funktionalität des Plugins zu nutzen, um das zu bekommen, was ich will. Außerdem scheinen meine eigenen Plugins ziemlich schlecht zu sein.
Ich möchte das bedingte Laden von zB comment.php (ich erlaube keine Kommentare in meinem Blog) und mehreren anderen versuchen. Ich habe den gesamten veralteten Code gelöscht. Ich habe kses.php runtergeschnitten, um die globalen Tabellen nur bei Bedarf zu laden. Ich habe l10n vereinfacht (ich mache keine Lokalisierung), so dass seine Funktionen die Zeichenketten sofort ohne Nachschlagen zurückgeben. Ich bin immer noch weit von der 30% -Marke entfernt, die ich willkürlich festgelegt habe.
Bearbeiten: Ich habe APC mit den Standardeinstellungen (32 MB Opcode-Cache) heruntergeladen und aktiviert. Hier ist der Vergleich:
Sie können sehen, dass das Laden des Codes massiv beschleunigt wurde und der Code auch weniger Speicherplatz beansprucht (wahrscheinlich, weil wir uns nur mit Opcodes befassen, nicht mit der Originalquelle). Der Speicherverbrauch ist aber immer noch recht hoch.