0

所以在工作中,我们有一个自制的模板系统,它重量轻,到目前为止对我们来说效果很好。

我们遇到的障碍是我们希望能够循环一个模板。用例类似于搜索结果。我们正在努力想办法做到这一点。我们现在想出了三种方法。首先是将 html 存储在循环中,然后循环遍历它并使用 concat 将变量放入 html 中。我们想到的第二种方法是重复包含一个文件。第三种方法是包含文件一次,使用输出缓冲来捕获其输出,将文本 echo " 添加到它,然后在其上使用 eval。(我的老板希望我们想出创造性的方法来做到这一点)。

好吧,我更喜欢包含重复方法,因为它允许我们将 html 与逻辑完全分离。eval 方法也可以做到这一点,但它似乎更骇人听闻。好吧,我们对此进行了一些时间测试,发现将 html 放在循环中(方法一)是最快的,紧随其后的是 eval 方法,包括多次进入最后。包括实际上比 eval 方法慢了大约 5-6 倍。(我们包含文件/评估文件 1000 次,并做了 100 次并对它们取平均值以获得我们的结果)。

有什么方法可以加快多重包含?(看起来每次我们执行 include php 都会再次访问文件系统。)

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

4

3 回答 3

2

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

影响时间来自:

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

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

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

为了保持代码干净,您可以创建包含 HTML 的函数、使用全局变量或包含需要显示到 HTML 中的所有数据的单个对象或数组变量,例如

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);
于 2009-11-10T20:05:01.327 回答
0

老问题,我知道。

无论如何,我建议在模板中使用一个简单的 for 或 foreach 循环。没有什么不妥。首先,因为在我看来循环遍历一些演示代码仍然是演示逻辑(因为这也使得将输出从列输出更改为行输出变得更容易——愚蠢的例子)。其次,PHP 仍然是一种模板语言。在模板中使用一些简单的控制结构并没有错。使用像 Smartys 这样的系统只是添加了另一层抽象(需要学习另一种语法),它具有 PHP 的大部分功能(因此会产生相当多的开销)。这在我看来是无稽之谈(旁注:对我来说,这是内部平台效应,一种反模式)。

于 2009-11-08T23:23:13.030 回答
0

缓存最后一页。我的意思是把你所有的“块”(循环,片段,无论你想怎么称呼它们),并将它们加入到缓存中的一个 PHP 文件中,然后从那时起就包含它。这样,您每次请求只需访问文件系统一次,而不是 25 次。

于 2009-06-03T22:07:44.487 回答