أسرع محرك قالب لـ PHP

باختيار محرك قالب لمشروع المذنب ، قررت مقارنة جميع المحركات الشائعة في مجتمع PHP. عادة ما يملي هذا الخيار من خلال الإطار: سيقوم السيمفوني بتغليف القوالب في Twig ، سيقوم مبرمج Laravel بتسليح نفسه بـ Blade. لكني كنت مهتمًا بالسؤال - كيف تختلف هذه الخيارات من حيث الأداء؟ بعد اختبار سبعة محركات و PHP النقي ، حصلت على إجابة. البيانات والجداول والأبطال والخاسرين - تحت الخفض!



وأشار إلى أسماء كبار المتقدمين ؛ وجد الباقي ، مسلحًا بإحصاءات GitHub ومناقشات حول Reddit. إليك القائمة:

Smarty: github.com/smarty-php/smarty
Plates: github.com/thephpleague/plates
شارب: github.com/bobthecow/mustache.php
Twig: github.com/twigphp/Twig
Blade: github.com / jenssegers / شفرة
BladeOne: github.com/EFTEC/BladeOne
اتيه: github.com/nette/latte

إذا كنت تعرف خيارا مهما - الكتابة، وأود أن أضيف على المحك. إن Blade مندمجة إلى حد كبير في Laravel ، لذلك كان عليّ أن أقوم ببعض عمليات التنفيذ المستقلة. لسوء الحظ ، لا يدعم أي منها مكونات Blade-X.

لفهم جوهر المعيار ، أسهل طريقة هي النظر إلى نسخة الكود مع PHP الخالص:

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

هذا اختبار اصطناعي لإخراج صفيف من ثلاثة كائنات في قالب HTML يحتوي على خاصيتين: كود HTML ووصفه المختصر.

هذا ما يبدو عليه التناظرية على Twig:

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

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

</body></html>

وهذه شفرة:

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

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

</body></html>

تم تشغيل الاختبارات في حاوية Ubuntu 20.04 / PHP 7.4 / Comet 0.6 على جهاز افتراضي مع 4 Ryzen 3600 نوى وذاكرة 4G:

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

ظهر هذا الوضع ، حيث يعكس كل رسم بياني متوسط ​​عدد الطلبات التي تمت معالجتها بنجاح في ثانية واحدة:



Pure PHP - متوقع أولاً ، ولكن بشكل غير متوقع ، أن Blade متأخر بالفعل عن النصف! ولماذا تتأخر لوحات "خفيفة الوزن" وراء غصين "قوي"؟ تستخدم جميع الأطر التخزين المؤقت المنتظم ، لذا تكون النتائج قريبة قدر الإمكان من تلك الموجودة بالفعل.

في إطار مقال واحد ، لم أرغب في زيادة التحميل على القارئ بتحليل موسع للكود ، واستراتيجيات العمل ، والتخزين المؤقت للمحركات ، وتحليل معايير اختيار محرك القالب الذي يهمني. إذا كان الموضوع مثيرًا للاهتمام - سأكتب تكملة.

كإعلان: انظر إلى Comet ، في المستقبل القريب - لجعله إطار PHP الأسرع والأكثر ملاءمة لإنشاء واجهات برمجة تطبيقات وخدمات صغيرة مريحة :)

All Articles