【问题标题】:PHP HTML generation - using string concatentionPHP HTML 生成 - 使用字符串连接
【发布时间】:2010-09-15 15:21:44
【问题描述】:

关于从 PHP 输出 html 的不同方法的问题;它们之间的性能差异是什么:

方法一——变量串联

$html = '';
$html .= '<ul>';
for ($k = 1; $k < = 1000; $k++){
    $html .= '<li> This is list item #'.$k.'</li>';
}
$html .= '</ul>';
echo $html;

方法 2 - 输出缓冲

ob_start();
echo '<ul>';
for ($k = 1; $k < = 1000; $k++){
    echo '<li> This is list item #',$k,'</li>';
}
echo '</ul>';

我怀疑你会因为不断修改和扩大变量而受到一些性能影响;对吗?

干杯!

感谢 GaryF,但我不想要关于架构的答案 - 这个问题是关于性能的。关于哪个更快,似乎有一些不同的意见/测试,这就是为什么还没有一个公认的答案。

【问题讨论】:

    标签: php performance string-concatenation


    【解决方案1】:

    我通常使用方法 #1,因此我可以将该 HTML 放在包含静态 HTML 的模板文件中的任何位置。我尝试在我的 PHP 中保留尽可能多的 HMTL。它使 PHP 更简洁、更短,因为模板通常是一个单独的文件。

    关于速度/性能,我认为差异会非常小。使用输出缓冲,它也一直在扩大一个变量,虽然该变量不可访问,但它必须存储在某个地方。

    我经常想知道打开和关闭 &lt;?php 是否比将其全部放入 &lt;?php 然后一次全部回显要慢。

    我认为最终我们在极其复杂的脚本中讨论毫秒。

    哦,是的,方法 #1 更加灵活,您可以在任何地方使用echo $html;

    【讨论】:

      【解决方案2】:

      确实,不断修改变量并重新打印它会产生轻微的开销。但是,这样做意味着脚本可能会在某些时候完成运行(由于中断或类似原因),并且连续的 echo 语句将部分打印页面,而不是什么也不打印。

      【讨论】:

        【解决方案3】:

        我打算输入一个关于 PHP 字符串如何可变的长回复(与 C 或 C# 中的不可变字符串相反),但我想我只会链接到 an older post I came across。关于使用 stringbuilder 的 Java 和 C# 解决方案,我基本上会处理您的问题。

        旁注:stringbuilder 解决方案类似于(未经测试):

        $html = array();
        $html[] = '<ul>';
        for ($k = 1; $k < = 1000; $k++){
            $html[] = '<li> This is list item #';
            $html[] = $k;
            $html[] = '</li>';
        }
        $html[] = '</ul>';
        echo implode('',$html);
        

        【讨论】:

          【解决方案4】:

          只是一些想法:

          • 输出缓冲会使您的页面看起来很慢,因为在整个脚本运行之前用户什么都看不到(尽管您的 #1 设置方式同样适用)。

          • php 中的字符串是可变的,因此连接并不像其他一些语言那样糟糕。话虽如此,输出缓冲可能会稍微快一点,因为默认情况下为输入分配的空间相当大(根据this 为 40K)

          最后,我想说这更多的是风格问题。如果您喜欢输出缓冲给您带来的好处,那么这可能是您要走的路。

          【讨论】:

            【解决方案5】:

            您的问题的答案也可以在这里找到:php: output[] w/ join vs $output .=

            字符串连接是构建字符串的最快方式。

            我还没有测试过“回声”与字符串构建,但只要您不使用缓冲输出,回声应该是最快的,因为顺序写入自刷新缓冲区。 (只有减速在冲洗,即使你提前进行字符串连接,你也不会真正避免)

            【讨论】:

              【解决方案6】:

              撇开字符串连接本身的想法不谈,你真的在​​问(我认为)你应该如何构建网页,我觉得任何形式的显式连接都可能是错误的做法。

              尝试使用Model-View-Control pattern 构建您的数据,并将其传递给一个简单的模板库(如Smarty),然后让它担心如何构建您的视图。

              更好的分离,更少的关注。

              【讨论】:

                【解决方案7】:

                我没有看到提到的是,通常,PHP 人员必须与需要对 HTML 进行分类或以其他方式添加样式的设计人员合作,因此解决方案必须牢记这一点。

                【讨论】:

                  【解决方案8】:

                  它有点旧,但 Sara Golemon 的 this post 可能会有所帮助。 AFAIK 输出缓冲功能非常快速和高效,echo 也是如此,所以这就是我要使用的。

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2010-12-02
                    • 2013-08-29
                    • 2010-12-30
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2015-09-18
                    相关资源
                    最近更新 更多