Le moteur de template le plus rapide pour PHP

En choisissant un moteur de template pour le projet Comet , j'ai décidé de comparer tous les moteurs populaires de la communauté PHP. Habituellement, ce choix est dicté par le framework: le symphoniste encapsulera les modèles dans Twig, le programmeur Laravel s'armera de Blade. Mais j'étais intéressé par la question - comment ces options diffèrent-elles en termes de performances? Après avoir testé sept moteurs et du PHP pur, j'ai obtenu une réponse. Données, horaires, champions et perdants - sous la coupe!



Il a rappelé les noms des meilleurs candidats; il a trouvé le reste, armé de statistiques GitHub et de discussions sur Reddit. Voici la liste:

Smarty: github.com/smarty-php/smarty
Plates: github.com/thephpleague/plates
Moustache: github.com/bobthecow/mustache.php
Twig: github.com/twigphp/Twig
Blade: github.com / jenssegers / blade
BladeOne: github.com/EFTEC/BladeOne
Latte: github.com/nette/latte

Si vous connaissez une option intéressante - écrivez, j'ajouterai au test. Blade est assez profondément intégré à Laravel, j'ai donc dû prendre quelques implémentations autonomes. Malheureusement, aucun d'entre eux ne prend en charge les composants Blade-X.

Pour comprendre l'essence du benchmark, le moyen le plus simple est de regarder la version du code en PHP pur:

$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>';

Il s'agit d'un test synthétique de sortie d'un tableau de trois objets dans un modèle HTML contenant deux propriétés: le code HTML et sa brève description.

Voici à quoi ressemble l'analogue sur Twig:

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

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

</body></html>

Et voici Blade:

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

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

</body></html>

Les tests ont été exécutés dans le conteneur Ubuntu 20.04 / PHP 7.4 / Comet 0.6 sur une machine virtuelle avec 4 cœurs Ryzen 3600 et une mémoire 4G:

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

Cette situation s'est avérée, chaque graphique reflète le nombre moyen de demandes traitées avec succès en une seconde:



PHP pur - attendu d'abord, mais de manière inattendue, que Blade est déjà deux fois moins en retard! Et pourquoi les plaques «légères» sont-elles à la traîne de la «puissante» Twig? Tous les frameworks utilisent une mise en cache régulière, donc les résultats sont aussi proches que possible des vrais.

Dans le cadre d'un article, je n'ai pas voulu surcharger le lecteur avec une analyse approfondie du code, des stratégies de travail et de la mise en cache des moteurs, une analyse des critères de choix d'un moteur de template qui m'importe. Si le sujet est intéressant - j'écrirai une suite.

Comme une publicité: regardez Comet , dans un avenir proche - pour en faire le framework PHP le plus rapide et le plus pratique pour créer des API et des microservices reposants :)

All Articles