PHP HTML生成-使用字符串连接

4
一个关于从PHP输出html的不同方法的问题; 这些方法之间的性能差异是什么:
方法1 - 变量连接
$html = '';
$html .= '<ul>';
for ($k = 1; $k < = 1000; $k++){
    $html .= '<li> This is list item #'.$k.'</li>';
}
$html .= '</ul>';
echo $html;

方法二 - 输出缓冲

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

我猜你不断修改和扩大变量会导致一些性能损失,这是正确的吗?
谢谢!
感谢GaryF,但我不想得到有关架构的答案 - 这个问题是关于性能的。似乎对于哪一个更快存在一些不同的意见/测试,这就是为什么还没有被接受的答案。
8个回答

5
除了字符串拼接的概念本身,我认为你真正想知道的是如何构建网页,而且我认为任何形式的显式拼接都可能是错误的做法。尝试使用模型-视图-控制器模式来构建数据,并将其传递给一个简单的模板库(如Smarty),让它来处理如何构建您的视图。更好的分离,更少的关注点。

2

这篇文章可能有点老,但是Sara Golemon的这篇文章可能会对您有所帮助。据我所知,输出缓冲函数非常快速高效,echo也是如此,因此这就是我会使用的方法。


2

我通常使用方法#1,这样我就可以在包含静态HTML的模板文件中的任何位置放置该HTML。我尽量避免在PHP中使用太多HTML。这样可以使PHP更加清洁和简短,因为模板通常是一个单独的文件。

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

我经常想知道打开和关闭<?php是否比将所有内容放在<?php中一次性echo'ing更慢。

我认为最终我们在处理极其复杂的脚本时只会涉及到毫秒级的时间。

哦对了,方法#1更加灵活,因为你可以在任何地方echo $html;


1

确实,不断修改变量并重新打印它会带来一些额外开销。然而,这样做意味着在某个时刻脚本可能会因为中断或类似的原因停止运行,而顺序的echo语句只会部分地打印页面,而不是什么都不打印。


1

只是一些想法:

  • 输出缓冲可以使您的页面看起来很慢,因为用户在整个脚本运行之前什么也看不到(尽管您已经按照#1设置了相同的情况)。

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

最后我想说这更多是一个风格问题。如果您喜欢输出缓冲所带来的好处,那么它可能是正确的选择。


1

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

字符串拼接是构建字符串最快的方法。

我没有测试过“echo”与字符串构建的比较,但只要你不使用缓冲输出,由于对自刷新缓冲区的顺序写入,“echo”应该是最快的。(唯一的减速在于刷新,即使你提前进行字符串拼接,也无法避免)


1

我本来想打一篇长篇回复,关于PHP字符串是可变的(与C或C#中的不可变字符串相对),但我认为我还是直接链接到一篇我之前看到的帖子吧。它基本上解决了你所问的问题,就像在Java和C#中使用stringbuilder的解决方案。

顺便说一句: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);

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接