为Comet项目选择模板引擎,我决定比较PHP社区中所有流行的引擎。通常,这种选择是由框架决定的:交响乐手将模板包装在Twig中,Laravel程序员将用Blade武装自己。但是我对这个问题感兴趣-这些选项在性能方面有何不同?在测试了七个引擎和纯PHP之后,我得到了答案。数据,时间表,冠军和失败者-减少了!
他回顾了顶级申请人的名字;他找到了其余的人,这些人都拥有GitHub的统计数据和有关Reddit的讨论。这是列表:Smarty:github.com/smarty-php/smarty盘子:github.com/thephpleague/plates小胡子:github.com/bobthecow/mustache.php树枝:github.com/twigphp/Twig刀片:github.com / jenssegers / bladeBladeOne: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>
这是Blade:<html><head></head><body>
@foreach ($data as $message)
<p>{{ $message->code }} : {{ $message->message }}</p>
@endforeach
</body></html>
测试在具有4个Ryzen 3600内核和4G内存的虚拟机上的Ubuntu 20.04 / PHP 7.4 / Comet 0.6容器中运行:wrk --connections=500 --threads=2 --duration=10s http:
事实证明,每种情况下的图表反映了在一秒钟内成功处理的请求的平均数量:
纯PHP-首先,但是出乎意料的是,Blade已经落后了一半!为什么“轻量级”板块落后于“功能强大”的Twig?所有框架都使用常规缓存,因此结果尽可能接近真实框架。在一篇文章的框架内,我不想让读者对代码,工作策略和引擎缓存,对选择模板引擎的标准进行分析的扩展分析对我来说很重要。如果这个话题很有趣-我会写续集。作为广告:请看Comet,在不久的将来-使它成为创建宁静的API和微服务的最快,最方便的PHP框架:)