El motor de plantillas más rápido para PHP

Al elegir un motor de plantillas para el proyecto Comet , decidí comparar todos los motores populares en la comunidad PHP. Por lo general, esta opción está dictada por el marco: el sinfonista envolverá las plantillas en Twig, el programador de Laravel se armará con Blade. Pero estaba interesado en la pregunta: ¿cómo difieren estas opciones en términos de rendimiento? Después de probar siete motores y PHP puro, obtuve una respuesta. Datos, horarios, campeones y perdedores, ¡por debajo del corte!



Recordó los nombres de los principales solicitantes; encontró el resto, armado con estadísticas de GitHub y discusiones sobre Reddit. Aquí está la lista:

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 conoce una opción interesante, escriba, la agregaré a la prueba. Blade está bastante integrado en Laravel, así que tuve que tomar un par de sus implementaciones independientes. Desafortunadamente, ninguno de ellos admite componentes Blade-X.

Para comprender la esencia del punto de referencia, la forma más fácil es mirar la versión del código con PHP puro:

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

Esta es una prueba sintética para generar una matriz de tres objetos en una plantilla HTML que contiene dos propiedades: código HTML y su breve descripción.

Así es como se ve el análogo en Twig:

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

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

</body></html>

Y esta es Blade:

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

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

</body></html>

Las pruebas se ejecutaron en el contenedor Ubuntu 20.04 / PHP 7.4 / Comet 0.6 en una máquina virtual con 4 núcleos Ryzen 3600 y memoria 4G:

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

Resultó esta situación, cada gráfico refleja el número promedio de solicitudes procesadas con éxito en un segundo:



PHP puro: se esperaba primero, pero inesperadamente, ¡Blade ya está la mitad de atrasado! ¿Y por qué las placas "livianas" están rezagadas detrás de la rama "poderosa"? Todos los marcos utilizan el almacenamiento en caché regular, por lo que los resultados son lo más cercanos posible a los reales.

Dentro del marco de un artículo, no quería sobrecargar al lector con un análisis extendido del código, estrategias de trabajo y almacenamiento en caché de motores, análisis de criterios para elegir un motor de plantillas que son importantes para mí. Si el tema es interesante, escribiré una secuela.

Como anuncio: mire Comet , en un futuro cercano, para que sea el marco PHP más rápido y conveniente para crear API y microservicios relajantes :)

All Articles