PHP模板循环结果

时间:2009-06-03 21:58:18

标签: php loops include templating

因此,在工作中,我们有一个家庭成长的模板系统,重量轻,到目前为止对我们来说非常有用。

我们要击中的墙是我们希望能够在模板上循环。用例类似于搜索结果。我们正试图想办法,我们可以做到这一点。我们现在已经提出了三种方法。首先是将html存储在循环中然后循环并使用concat将变量放入html中。我们想到的第二种方式是反复包含一个文件。第三种方法是包含文件一次,使用输出buffereing捕获其输出,添加文本echo“,然后使用eval。(我的老板希望我们想出创造性的方法)。

好吧,我更喜欢include重复方法,因为它允许我们将html与逻辑完全分开。 eval方法也可以做到这一点,但它看起来更像一些hackish。好吧,我们对此进行了一些时间测试,发现在循环内部(方法一)中的html是最快的,然后是eval方法,并且包括多次在最后。包括实际上比eval方法慢约5-6倍。 (我们将文件/评估文件包括1000次,然后进行了100次并对其进行平均以得到我们的结果。)

有没有办法加快多重包含? (似乎每次我们执行include php都会再次访问文件系统。)

或者有没有人有办法完成这类事情?

3 个答案:

答案 0 :(得分:2)

正如您的测试所示,优化脚本的最佳方法是将已包含的HTML代码循环到您的脚本中。

影响时间来自:

  • eval()调用PHP解析器来验证代码
  • include()使用磁盘访问

每个include()然后降级读取未更改文件的磁盘的性能。然后,优化此磁盘访问将是您的eval()选项:

  • include():intial-parser + [disk-access + parser] * N循环;
  • eval():初始解析器+磁盘访问+解析器* N循环
  • 内联HTML:初始解析器

为了保持代码清洁,您可以创建包含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,反模式)。