Die schnellste Template Engine für PHP

Als ich eine Template-Engine für das Comet- Projekt auswählte , beschloss ich, alle in der PHP-Community beliebten Engines zu vergleichen. Normalerweise wird diese Wahl vom Framework vorgegeben: Der Symphoniker verpackt die Vorlagen in Twig, der Laravel-Programmierer rüstet sich mit Blade aus. Aber ich war an der Frage interessiert - wie unterscheiden sich diese Optionen in Bezug auf die Leistung? Nachdem ich sieben Engines und reines PHP getestet hatte, bekam ich eine Antwort. Daten, Zeitpläne, Champions und Verlierer - unter dem Strich!



Er erinnerte sich an die Namen der Top-Bewerber, den Rest fand er mit GitHub-Statistiken und Diskussionen über Reddit. Hier ist die Liste:

Smarty: github.com/smarty-php/smarty
Platten: github.com/thephpleague/plates
Schnurrbart: github.com/bobthecow/mustache.php
Zweig: github.com/twigphp/Twig
Blade: github.com / jenssegers /
klingen BladeOne: github.com/EFTEC/BladeOne
Latte: github.com/nette/latte

Wenn Sie eine interessante Option kennen - schreiben Sie, werde ich den Test ergänzen. Blade ist ziemlich tief in Laravel integriert, daher musste ich einige seiner eigenständigen Implementierungen vornehmen. Leider unterstützt keine von ihnen Blade-X-Komponenten.

Um die Essenz des Benchmarks zu verstehen, ist es am einfachsten, sich die Codeversion mit reinem PHP anzusehen:

$data = [ 
    (object) [
    "code" => 200, 
    "message" => "OK"
    ],
    (object) [
        "code" => 404, 
        "message" => "Not Found"
    ],
    (object) [
        "code" => 500, 
        "message" => "Internal Server Error"
    ],		 
];

$html = '<html><head></head><body>';
foreach ($data as $message) {
    $html .= "<p>$message->code : $message->message</p>";
}
$html .= '</body></html>';

Dies ist ein synthetischer Test zum Ausgeben eines Arrays von drei Objekten in eine HTML-Vorlage, die zwei Eigenschaften enthält: HTML-Code und seine kurze Beschreibung.

So sieht das Analogon auf Twig aus:

<html><head></head><body>

    {% for message in data %}
        <p>{{ message.code }} : {{ message.message }}</p>
    {% endfor %}

</body></html>

Und das ist Blade:

<html><head></head><body>

    @foreach ($data as $message)
        <p>{{ $message->code }} : {{ $message->message }}</p>
    @endforeach

</body></html>

Die Tests wurden im Ubuntu 20.04 / PHP 7.4 / Comet 0.6-Container auf einer virtuellen Maschine mit 4 Ryzen 3600-Kernen und 4G-Speicher ausgeführt:

wrk --connections=500 --threads=2 --duration=10s http://comet:8080/php

In dieser Situation spiegelt jedes Diagramm die durchschnittliche Anzahl der erfolgreich verarbeiteten Anforderungen in einer Sekunde wider:



Reines PHP - zuerst erwartet, aber unerwartet, dass Blade bereits halb so weit zurückliegt! Und warum bleiben die „leichten“ Platten hinter dem „leistungsstarken“ Zweig zurück? Alle Frameworks verwenden reguläres Caching, sodass die Ergebnisse den tatsächlichen Ergebnissen so nahe wie möglich kommen.

Im Rahmen eines Artikels wollte ich den Leser nicht mit einer erweiterten Analyse des Codes, Arbeitsstrategien und Caching von Engines sowie einer Analyse der Kriterien für die Auswahl einer für mich wichtigen Template-Engine überladen. Wenn das Thema interessant ist, werde ich eine Fortsetzung schreiben.

Als Werbung: Schauen Sie sich Comet in naher Zukunft an - um es zum schnellsten und bequemsten PHP-Framework für die Erstellung erholsamer APIs und Microservices zu machen :)

All Articles