Hallo zusammen,
ich mache mir gerade ein paar Gedanken zum Thema Performance. Bei einem großen Projekt, welches auf verschiedenen Systemen ausgerollt wird, soll die Performance verbessert werden.
Üblicherweise wird das ganze in Windows-Umgebungen mit IIS und PHP 7.1 FastCgi installiert (ich weiß, das ist nicht optimal), aber die Optimierungen sollen zumindest auch dort greifen.
Folgende Überlegungen habe ich dazu schon angestellt bzw. umgesetzt und gebenchmarkt:
Aktuelle Erkenntnisse anhand der Traces:
Vielen Dank und viele Grüße
ich mache mir gerade ein paar Gedanken zum Thema Performance. Bei einem großen Projekt, welches auf verschiedenen Systemen ausgerollt wird, soll die Performance verbessert werden.
Üblicherweise wird das ganze in Windows-Umgebungen mit IIS und PHP 7.1 FastCgi installiert (ich weiß, das ist nicht optimal), aber die Optimierungen sollen zumindest auch dort greifen.
Folgende Überlegungen habe ich dazu schon angestellt bzw. umgesetzt und gebenchmarkt:
- Datenbank-Optimierung (Überfllüssige und langsame Queries, Caching, Prepared-Statements)
- Mögliche Opcache-Einstellungen und Verbesserungen
- Kritische Programmstellen optimieren (Lazy-Loading, XDebug-Tracing)
- Composer-Autoloading optimieren (--no-dev --optimize)
- Php-Userland-Caching Backends für teure Berechnungen (Redis, Apcu, PhpFilesCache, FilesystemCache)
Aktuelle Erkenntnisse anhand der Traces:
- Der composer autoloader ist relativ langsam - Allein das die autoload.php (insbesondere die darin geladene autoload_static.php) in der optimierten Fassung geladen wird, dauert mir zu lange (Durchschnittlich 20ms)
- PHP Sessions sind je nach Konfiguration langsam - Das Schreiben und Laden der Session bei jedem Request ist langsam, wenn die Session im Dateisystem liegt (und nicht z.B. Redis verwendet wird)
- Ich habe nicht immer ein schnelles Caching-Backend (Redis kann nicht überall installiert werden)
- Ich möchte gerne den composer autoloader verbessern. Gibt es neben --optimize und --no-dev vielleicht undokumentierte Optimierungsmöglichkeiten, die ihr kennt? Überlegungen dazu:
- Wäre es vielleicht möglich, da sich die Datei autoload_static.php nur bei einem rebuild des autoloadings über composer ändert, das ganze in die PHP compiletime zu verlagern? Verwendet man const statt define für die Definition von Konstanten, ist das viel schneller, insbesondere bei großen Mengen von Konstanten. Leider kann man mit const nur numerische arrays und keine assoziativen arrays erstellen.
- In bestimmten Fällen KANN ich kein Redis als Caching-Backend nutzen (oder Backends, die die Installation eines Fremd-Produkts erfordern) und möchte gewährleisten, dass ich einen möglichst schnellen und portablen Cache anbieten kann. Welches überall nutzbare Caching-Backend würdet ihr empfehlen und warum? Überlegungen dazu:
- Ich habe z.B. die Symfony-Caching-Backends zur Verfügung (Apcu, PhpFilesCache, FilesystemCache). In einigen Fällen sorgt der Apcu für Abstürze und 500er - Fehler Windows halt... Der PhpFilesCache sieht interessant aus, da er den opcache nutzt, leider ist er nicht unterstützt, da die Funktion opcache_invalidate trotz aktiviertem opcache nicht existiert...(Wieso das eigentlich?)
- Lohnt es sich eventuell, einen shmop-Cache zu implementieren, damit der Cache im Shared-Memory (also im Ram) liegt, statt auf der Platte? Die extension wäre verfügbar...
- Kann man über einen custom session_save_handler die Sessions in den Ram verlagern, ohne dass man eine Ramdisk anlegen muss?
- Gibt es generell eine Möglichkeit, PHP compiletime Hashmaps zu speichern? (ähnlich const X = [1,2,3]
- Gibt es weitere Performance-Überlegungen oder Artikel, die ihr empfehlen könnt? (gern auch die Standardsachen, was ich schon weiß, kann ich ja ignorieren
Vielen Dank und viele Grüße
Kommentar