【问题标题】:PHP Templating Looping ResultsPHP 模板循环结果
【发布时间】:2009-06-03 21:58:17
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 这对于使用 sprintf 来说似乎很自然——使用 sprintf 的语法(%s、%d 等)格式化模板,执行 file_get_contents() 以获取格式化的 html 块,然后发送在变量中。
  • PHP 参考:php.net/sprintf
  • @artlung:呃,sprintf 太丑了!你为什么要这样做?
  • @musicfreak 我没有声称 sprintf 的美。这是一种将任意变量注入到格式化 HTML 块中的机制。此外,Boushley,您可能会查看 Smarty 模板系统 smarty.net> 处理变量的方式。例如:smarty.net/manual/en/language.basic.syntax.php。 Smarty 只解决了这个问题,并可能会为您提供有助于改进您自己开发的系统的语法的想法。
  • 您可以添加一些伪代码来尝试了解它现在是如何工作的吗?

标签: php loops include templating


【解决方案1】:

正如您的测试表明的那样,优化脚本的最佳方法是将已经包含的 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);

【讨论】:

  • 很好地总结了我们的发现......拥有这个功能是个好主意。我真的希望有一些我们没想到的聪明东西,但我想不会。
  • 下一步,如 phpBB 所示,编译公共部分并将它们保存到缓存中,并在几分钟或更改后更新它们。我认为你在时间安排方面做得很好
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    老问题,我知道。

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

    【讨论】:

    • 这不是一个坏主意。我们实际上最终在工作中做的是使用 php 的内置 DOM 解析器来加载文件,然后使用它来更改每次使用的模板。最大的问题是我们希望拥有非常干净的模板,其中包含最少的 php(如果我们可以摆脱它,则没有控制结构)并保持高水平的可定制性,例如能够针对每次发布的内容进行更改。
    猜你喜欢
    • 1970-01-01
    • 2012-10-09
    • 2013-04-22
    • 2011-08-18
    • 1970-01-01
    • 2020-09-26
    • 2022-01-25
    • 2016-07-21
    • 2015-10-05
    相关资源
    最近更新 更多