Mesin templat tercepat untuk PHP

Memilih mesin template untuk proyek Comet , saya memutuskan untuk membandingkan semua mesin yang populer di komunitas PHP. Biasanya pilihan ini ditentukan oleh kerangka kerja: symphonist akan membungkus template dalam Twig, programmer Laravel akan mempersenjatai dirinya dengan Blade. Tetapi saya tertarik pada pertanyaan - bagaimana perbedaan opsi ini dalam hal kinerja? Setelah menguji tujuh mesin dan PHP murni, saya mendapat jawaban. Data, jadwal, juara, dan yang kalah - di bawah cut!



Dia mengingat nama-nama pelamar teratas, dia menemukan sisanya, dipersenjatai dengan statistik GitHub dan diskusi tentang Reddit. Berikut daftarnya:

Smarty: github.com/smarty-php/smarty
Pelat: github.com/thephpleague/plates
Kumis: 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

Jika Anda tahu opsi yang menarik - tulis, saya akan menambah tes. Blade cukup terintegrasi ke dalam Laravel, jadi saya harus mengambil beberapa implementasi mandiri. Sayangnya, tidak ada satupun yang mendukung komponen Blade-X.

Untuk memahami inti dari tolok ukur, cara termudah adalah dengan melihat versi kode dengan PHP murni:

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

Ini adalah tes sintetis untuk menghasilkan array dari tiga objek ke dalam template HTML yang berisi dua properti: kode HTML dan deskripsi singkatnya.

Ini adalah analog dari Twig:

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

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

</body></html>

Dan ini Blade:

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

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

</body></html>

Pengujian dijalankan dalam wadah Ubuntu 20.04 / PHP 7.4 / Comet 0.6 pada mesin virtual dengan 4 Ryzen 3600 core dan memori 4G:

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

Ternyata penyejajaran ini, setiap grafik mencerminkan jumlah rata-rata permintaan yang berhasil diselesaikan dalam satu detik:



PHP murni - yang diharapkan lebih dulu, tetapi tanpa diduga, Blade itu sudah setengah di belakang! Dan mengapa Pelat "ringan" tertinggal di belakang Ranting "kuat"? Semua kerangka kerja menggunakan caching biasa, sehingga hasilnya sedekat mungkin dengan yang asli.

Dalam kerangka satu artikel, saya tidak ingin membebani pembaca dengan analisis kode yang diperluas, strategi kerja dan caching mesin, analisis kriteria untuk memilih mesin templat yang penting bagi saya. Jika topiknya menarik - saya akan menulis sekuel.

Sebagai iklan: lihat Comet , dalam waktu dekat - jadikan kerangka PHP tercepat dan ternyaman untuk membuat API dan layanan mikro yang tenang :)

All Articles