因此,在工作中,我们有一个家庭成长的模板系统,重量轻,到目前为止对我们来说非常有用。
我们要击中的墙是我们希望能够在模板上循环。用例类似于搜索结果。我们正试图想办法,我们可以做到这一点。我们现在已经提出了三种方法。首先是将html存储在循环中然后循环并使用concat将变量放入html中。我们想到的第二种方式是反复包含一个文件。第三种方法是包含文件一次,使用输出buffereing捕获其输出,添加文本echo“,然后使用eval。(我的老板希望我们想出创造性的方法)。
好吧,我更喜欢include重复方法,因为它允许我们将html与逻辑完全分开。 eval方法也可以做到这一点,但它看起来更像一些hackish。好吧,我们对此进行了一些时间测试,发现在循环内部(方法一)中的html是最快的,然后是eval方法,并且包括多次在最后。包括实际上比eval方法慢约5-6倍。 (我们将文件/评估文件包括1000次,然后进行了100次并对其进行平均以得到我们的结果。)
有没有办法加快多重包含? (似乎每次我们执行include php都会再次访问文件系统。)
或者有没有人有办法完成这类事情?
答案 0 :(得分:2)
正如您的测试所示,优化脚本的最佳方法是将已包含的HTML代码循环到您的脚本中。
影响时间来自:
每个include()然后降级读取未更改文件的磁盘的性能。然后,优化此磁盘访问将是您的eval()选项:
为了保持代码清洁,您可以创建包含HTML的函数,使用全局变量,或者包含需要在HTML中显示的所有数据的单个Object或Array变量,例如
function html_comment ($comment)
{
//global $comment;
?>
<div class="comment">
<div class="author"><?php echo $comment['author'] ?></div>
<div class="date"><?php echo $comment['date'] ?></div>
<div class="date"><?php echo $comment['content'] ?></div>
</div>
<?php
}
...
foreach ($comments as $comment)
html_comment($comment);
答案 1 :(得分:0)
缓存最终页面。我的意思是把你所有的“块”(循环,碎片,你想要的任何东西)加入到你的缓存中的一个PHP文件中,然后从那里开始包含它们。这样你每次请求只会打一次文件系统,而不是25次。
答案 2 :(得分:0)
老问题,我知道。
无论如何,我建议在模板中使用简单的for或foreach循环。没有什么不妥。首先,因为循环一些表示代码仍然是我眼中的表示逻辑(因为这也使得更容易更改输出,例如,列中的输出以行输出 - 愚蠢的例子)。其次,PHP仍然是一种模板语言。在模板中使用一些简单的控制结构没有任何问题。使用像Smartys这样的系统只是添加另一层抽象(使用另一种语法来学习),它具有PHP的大部分功能(因此产生了相当多的开销)。这在我眼里是胡说八道(旁注:对我来说是inner-platform effect,反模式)。