5 Möglichkeiten zur Steigerung der PHP-Leistung – Tideways

5 Möglichkeiten zur Steigerung der PHP-Leistung

BONUS: Wir haben dieses Thema mit einem Experten in der PHP-Community in unserem Podcast diskutiert:

Aus der sprichwörtlichen Box bietet PHP eine anständige Leistung. Es gibt jedoch einige Dinge, die wir als PHP-Entwickler und Systemadministratoren tun können, um die Leistung noch weiter zu steigern. manchmal fast ohne Aufwand.

In diesem Beitrag werde ich fünf dieser Wege durchgehen. Wenn Sie mit dem Lesen fertig sind, sollten Sie zumindest eine deutliche Steigerung der Leistung Ihrer PHP-Anwendung feststellen. Fangen wir an.

PHP 7 verwenden

Eine der besten Möglichkeiten, die Leistung von PHP zu verbessern, besteht darin, die neueste Version (PHP 7) auszuführen. Es bietet eine signifikante Geschwindigkeitsverbesserung gegenüber jeder vorherigen Version. Jetzt werden die Ergebnisse immer variieren, da keine zwei Anwendungen jemals gleich sind. Basierend auf Berichten verschiedener Entwickler und namhafter Hosting-Unternehmen sind die Leistungsverbesserungen jedoch erheblich.

Hier ist ein kleines Beispiel:

  • Offizielle PHP-Benchmarks berichten, dass PHP 7 im Vergleich zu PHP 5.6 doppelt so viele Anfragen pro Sekunde ausführen kann.
  • Die PHP-Leistungsbenchmarks von Kinsta zeigen, dass WordPress 5.0 3x so viele Transaktionen ausführen kann wie PHP 5.6; und
  • Pantheon berichtete, dass PHP 7 eine Verbesserung von 64% gegenüber Version 5.3 ergab.

Wenn Ihnen das nicht ausreicht, überprüfen Sie Ihre Benchmarks und sehen Sie, was sie sagen.

Zusätzlich wurde PHP 7.0.0 am 3. Dezember 2015 veröffentlicht, und die neueste stabile Version, 7.3.6, wurde am 30. Mai dieses Jahres veröffentlicht.

Darüber hinaus wurde die endgültige Version von PHP 5, 5.6, vor 7 Monaten, am 31. Dezember 2018, EOL (End of Life). Wenn Sie es noch nicht getan haben, ist es an der Zeit, zu PHP 7 überzugehen. Machen Sie das Upgrade und, wie Rasmus auf der phpCE 2018 sagte, werden Sie grün, indem Sie Ihre Hosting-Kosten senken.

Xdebug deinstallieren

Als nächstes müssen Sie überprüfen, ob Xdebug nicht auf Ihren Produktionsservern installiert ist. Sicher, Xdebug ist einer der anspruchsvollsten und umfassendsten Profiler und Debugger für PHP, aber es sollte niemals auf einem Produktionsserver aktiviert (sogar installiert) werden, zumindest bis Xdebug 3 veröffentlicht wird und Sie sollten sich uns anschließen, um Derick bei der Arbeit daran zu unterstützen.

Während die Leistungsbenchmarks variieren (dies ist immer der Fall), zeigte ein Bericht über Stack Overflow eine Leistungssteigerung von 50%, indem Xdebug vollständig entfernt wurde. Was mehr ist, ist es wichtig zu beachten, dass, obwohl Xdebug auf dem Server installiert war — es war nicht einmal aktiviert!

Xdebug Performance BenchmarkXdebug Performance Benchmark

Um zu überprüfen, ob es installiert ist, führen Sie php -m | grep -i xdebug aus oder überprüfen Sie das Administrationsfenster Ihres Hosting-Providers. Und wenn Sie mehr darüber erfahren möchten, wie Xdebug funktioniert, lesen Sie die Xdebug-Dokumentation.

Use Composer Optimize Autoloader

Obwohl wir wahrscheinlich alle sehr vertraut damit sind, Composer für die Paketverwaltung zu verwenden, werden unsere Anwendungen nicht so gut wie möglich funktionieren, wenn wir die generierte Konfiguration nicht optimieren.

Hier ist ein Zitat aus der Composer-Dokumentation, das erklärt, warum:

aufgrund der Art und Weise, wie PSR-4- und PSR-0-Autoloading-Regeln eingerichtet sind, muss it Composer das Dateisystem überprüfen, bevor ein Klassenname endgültig aufgelöst werden kann. Dies verlangsamt die Dinge ziemlich, ist aber in Entwicklungsumgebungen praktisch, da sie beim Hinzufügen einer neuen Klasse sofort erkannt / verwendet werden können, ohne die Autoloader-Konfiguration neu erstellen zu müssen.

Um die Leistung zu verbessern, bietet Composer drei Optimierungsstufen an::

  • Klasse karte generation
  • Maßgebliche klasse karten
  • APCu cache

1: Class Map generation

Diese Strategie konvertiert PSR-4 /PSR-0-Regeln in Classmap-Regeln. Diese Strategie ist schneller, da die Classmap sofort den vollständigen Pfad zu bekannten Dateien zurückgeben kann und eine Dateisystemstatistikoperation vermeidet.

Um diese Optimierungsstufe zu aktivieren, führen Sie den folgenden Befehl aus:

composer dump-autoload --optimize 

2/ A: Autoritative Klassenzuordnungen

Zusätzlich zur automatischen Aktivierung von Ebene 1 versucht der Autoloader bei Verwendung dieser Ebene nicht, das Dateisystem gemäß PSR-4-Regeln zu durchsuchen, wenn in der generierten Klassenzuordnung keine Klasse gefunden wird. Führen Sie den folgenden Befehl aus, um diese Optimierungsstufe zu aktivieren:

composer dump-autoload --classmap-authoritative 

2/ B: APCu-Cache

Diese Ebene fügt einen APCu-Cache als Fallback für die Klassenzuordnung hinzu. Die Klassenmap wird jedoch nicht generiert. In Anbetracht dessen müsste Stufe eins manuell aktiviert werden. Führen Sie den folgenden Befehl aus, um diese Optimierungsstufe zu aktivieren:

composer dump-autoload --apcu 

Es gibt Kompromisse

Während jede dieser Ebenen die Anwendungsleistung verbessern kann, haben sie jeweils Kompromisse, die verstanden werden müssen, bevor sie verwendet werden. Stellen Sie sicher, dass Sie die Composer-Dokumentation konsultieren, bevor Sie sie verwenden.

Verwenden Sie einen OPcache

Da PHP eine interpretierte und keine kompilierte Sprache ist, muss die PHP-Laufzeit den Quellcode in ausführbaren Bytecode konvertieren, bevor er ausgeführt werden kann. Und da PHP eine Shared-Nothing-Architektur ist, muss dieser Prozess bei jeder Anfrage stattfinden.

Bei einem Opcode-Cache (OPcache) muss dieser Schritt jedoch nur einmal für jede Datei erfolgen, da die generierten Opcodes stattdessen im gemeinsam genutzten Speicher zwischengespeichert und dort referenziert werden können.

Wie Sie sich vorstellen können, ist ein OPcache eine der am wenigsten intensiven Möglichkeiten, die Leistung einer PHP-Anwendung zu verbessern, da sich kein Code ändern muss. Einige Berichte zeigen eine Geschwindigkeitsverbesserung von bis zu 70%.

Im Laufe der Jahre gab es mehrere Opcode-Caches für PHP. OPcache (ehemals Zend Cache) wird seit Version 5.5 mit PHP gebündelt — und ist standardmäßig in PHP 7 aktiviert.

Um mehr darüber zu erfahren, lesen Sie die OPcache-Dokumentation. Um mehr über die Leistungsoptimierung von OPcache zu erfahren, lesen Sie den ausgezeichneten Artikel von Hayden James sowie den Beitrag von Tideway zum Optimieren.

Verwenden Sie PHP 7 Preloading

Wenn Sie noch nichts von der neuen Preloading-Funktion von PHP 7.4 gehört haben, ist sie sehr cool! Kurz gesagt, die Funktion bringt die Opcache-Funktionalität weiter als je zuvor.

Um es kurz zusammenzufassen: Wenn eine PHP-Quelldatei zum ersten Mal gefunden wird, muss sie analysiert und dann in maschinenabhängigen Bytecode kompiliert werden, bevor die Zend Engine sie ausführen kann. Opcaches reduzieren den Overhead dieses Prozesses erheblich, da nach dem ersten Parsen und Kompilieren des Quellcodes die Bytecodes in einem Opcode-Cache im gemeinsam genutzten Speicher gespeichert werden.

Wenn das nächste Mal eine Anforderung für diese Datei auftritt, überprüft PHP, ob der Opcode-Cache Bytecodes für die Datei enthält. Wenn ja, werden sie zurückgegeben und verwendet. Wenn nicht (oder wenn sich die Quelldatei seit dem Kompilieren der Bytecodes geändert hat), wird die Quelldatei analysiert, kompiliert und zwischengespeichert. Dies gibt PHP einen bemerkenswerten Leistungsschub.

Schauen wir uns nun an, wie das Vorladen funktioniert. Um den implementierenden RFC zu zitieren:

Beim Serverstart – bevor ein Anwendungscode ausgeführt wird – können wir einen bestimmten Satz von PHP-Dateien in den Speicher laden – und deren Inhalt für alle nachfolgenden Anforderungen, die von diesem Server bedient werden, “dauerhaft verfügbar” machen. Alle in diesen Dateien definierten Funktionen und Klassen stehen Anfragen sofort zur Verfügung, genau wie interne Entitäten. Preloading sorgt dafür, dass:

  • Alle Funktionen und die meisten Klassen, die in diesen Dateien definiert sind, werden dauerhaft in die Funktions- und Klassentabellen von PHP geladen und stehen im Kontext zukünftiger Anforderungen dauerhaft zur Verfügung.
  • PHP löst Klassenabhängigkeiten und Verknüpfungen mit übergeordneten Elementen, Schnittstellen und Merkmalen auf (was beim Opcode-Caching nicht der Fall ist).
  • PHP entfernt unnötige Includes und führt weitere Optimierungen durch.

Wenn der Code für eine gesamte Anwendung, einschließlich ihres Frameworks (wie Zendesk, Symfony und Laravel), in den Speicher vorgeladen wird, Code, der sich nur beim Neustart des Servers geändert hat, werden die meisten Anwendungen eine deutlich bessere Leistung erbringen.

Das heißt, das Vorladen hat einige potenzielle Nachteile, über die Sie Bescheid wissen sollten:

  • Ein Neustart des Servers ist erforderlich, wenn sich die Quelldateien ändern.
  • Das Vorladen funktioniert in Shared-Hosting-Umgebungen nicht.
  • Das Vorladen funktioniert nicht, wenn mehrere Versionen derselben Anwendung vorhanden sind.

Das Vorladen ist nicht magisch. Sowohl Ihr Code als auch Ihre Bereitstellungsprozesse müssen überarbeitet werden, um davon profitieren zu können. Beispielsweise muss jemand ein benutzerdefiniertes Loader-Skript entwickeln, um zu bestimmen, welche Dateien beim Serverstart geladen werden sollen, und dieses Skript muss beim Serverstart ausgeführt werden. Unabhängig davon ist es eine signifikante Verbesserung, in die es sich zu investieren lohnt!

Verwenden Sie jetzt einen Profiler

für eine Option, die etwas mehr Arbeit erfordert als die vorherigen fünf. Oft springen wir ein und versuchen zu erraten, wo die Leistungsengpässe in unseren Anwendungen liegen, indem wir Intuition und fundierte Vermutungen verwenden.

Diese können zwar funktionieren, sind jedoch nicht die effizientesten Ansätze. Stattdessen können wir Code-Profiler verwenden, um unseren Code zu analysieren und zu zeigen, wo die Engpässe liegen. Insbesondere helfen sie bei der Beantwortung von Fragen wie den folgenden:

  • Wie oft wurde jede Methode aufgerufen?
  • Was war die maximale Ausführungszeit jeder Methode?
  • Was war die durchschnittliche Ausführungszeit jeder Methode?
  • Wie oft wurde eine Datei aufgenommen?
  • Welchen Pfad hat eine Anfrage durch eine Anwendung genommen (von der ersten bis zur letzten Codedatei)?

Wenn Sie einen Drilldown in die Ergebnisse eines Profilers durchführen, können Sie oft angenehm überrascht, wenn auch eher schockiert sein, wenn Sie feststellen, dass Ihre Anwendung Codepfade und Klassen ausführt, die Sie nie erwartet haben.

Basierend auf den Informationen im Profiler-Bericht können Sie und Ihr Team dann besser verstehen, was Ihre Anwendung tut, und fundierte Umgestaltungen vornehmen, um sie bei Bedarf zu ändern.

Wenn Sie gerade erst mit der Profilerstellung beginnen, gibt es mehrere Optionen für PHP. Die am häufigsten verwendeten sind:

  • Xdebug’s Profiler
  • Tideway’s XHProf extension (& XHGui)
  • spx Profiler
  • forp

Abschließend

Und das sind fünf Möglichkeiten, die Qualität Ihrer PHP-Anwendungen deutlich zu verbessern. Jeder von ihnen allein liefert Ihnen eine bemerkenswerte Leistungsverbesserung. Wenn Sie jedoch zusammen verwendet werden, sollten Sie eine signifikante Verbesserung der Leistung, ganz zu schweigen von der Qualität, erwarten.

Leave a Reply