【问题标题】:PHP templating is terribly slowPHP模板非常慢
【发布时间】:2026-02-14 00:25:05
【问题描述】:

我有自己的简单模板系统,它基于正则表达式。 Here it is

它的设计方式是我可以只从 mysql 结果中传递数组,它会从定义的模板文件中返回 html 代码。

所以如果我传递数组

array(3) { 
[0]=> array(5) {["DATE"]=> string(11) "21.04. 2013" ["NICK"]=> string(7) "Nashren"} 
[1]=> array(5) {["DATE"]=> string(11) "22.10. 2013" ["NICK"]=> string(13) "Superman"} 
[2]=> array(5) {["DATE"]=> string(11) "10.07. 2013" ["NICK"]=> string(13) "Superman"}

并且有模板

<td class="forum-last"> <strong>{{DATE}}</strong> <br> {{NICK}} </td>

它会按预期返回

<td class="forum-last"> <strong>21.04. 2013</strong> <br> Nashren </td>
<td class="forum-last"> <strong>22.10. 2013</strong> <br> Superman </td>
<td class="forum-last"> <strong>10.07. 2013</strong> <br> Superman </td>

但是!在这个特定的示例中,执行实际上需要 YEARS (比如 5 秒左右)。

我要显示的 Sql 查询是:

SELECT forum_kategorie.NAME,forum_kategorie.DESC,DATE,uzivatele.NICK,USR
FROM `zpravy`
LEFT JOIN forum_kategorie ON CONCAT( NAME,  "forum" ) = URL
LEFT JOIN uzivatele on USR = uzivatele.ID

WHERE DATE = (SELECT MAX(DATE)
               FROM zpravy
               WHERE CONCAT( NAME,  "forum" ) = URL)
GROUP BY NAME

这是上面脚本的用法。

include("php/themizer.php"); 



    $theme = new Themizer("forum-item",$res);

    $list = array("data" => $theme->getResult());

    $final = new Themizer("forum-table",$list);

     echo $final->getResult();

这可能是什么?

【问题讨论】:

  • 实际上需要 YEARS 才能执行(比如 5 秒左右).. 所以不是几年。
  • 是模板解析耗时还是MySQL查询?
  • 使用现有的模板引擎,或者不使用...
  • 你应该检查“literally”的意思——它的意思是真的。那么它真的需要几年,还是只需要几秒钟?
  • RoyalBg 从那以后,模板引擎灭绝了 ExplosionPills 现在看起来它的 Mysql 查询 Chris 很好......是的

标签: php mysql regex system templating


【解决方案1】:

您在连接中使用的列应该被索引。

forum_kategorie.name, zpravy.date, url

【讨论】:

    【解决方案2】:

    您是否分别测量了操作(mysql 查询和模板处理)?

    【讨论】:

      【解决方案3】:

      使用 RegEx(或 SearchReplace)函数真的很慢。 每个请求都说必须解析模板并且必须完成替换。

      这样的构造,有很多缺点,比如不可缓存等。

      看看smarty.net - 这是一个很好的php模板引擎。 易于使用。

      如果你不喜欢使用 Smarty,你也可以使用纯 PHP。 它也是一个模板引擎。

      只需将 HTML 放入单独的 PHP 文件中即可。 您可以使用短标签&lt;?=$var&gt; 来输出内容。 当然诅咒你也可以使用长标签。 此外,您还拥有所有可用的 php 函数,包括循环。 通过include 命令使用子模板。

      尽量避免将程序逻辑与显示逻辑混在一起。

      【讨论】:

      • 实际上我现在在我的新项目中使用分离的 PHP 文件。这只是较旧的东西,在哪里实现。有其原因,html脚本编写者可以自己添加模板。感谢您的建议
      • 如果您喜欢答案,请使用upvote。如果一个答案是您问题的答案,请使用接受答案(这只能是一个) - 谢谢