关于从PHP输出html的不同方法的问题;这些之间的性能差异是什么:
方法1 - 变量连接
$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,但我不想要关于架构的答案 - 这个问题是关于性能的。似乎有一些不同的意见/测试关于哪一个更快,这就是为什么还没有接受的答案。
答案 0 :(得分:5)
除了字符串连接的想法之外,你真的在问(我认为)你应该如何构建网页,这让我觉得任何形式的显式连接都可能是错误的。
尝试使用Model-View-Control pattern来构建数据,并将其传递给一个简单的模板库(如Smarty),让它担心如何构建视图。
更好的分离,更少的顾虑。
答案 1 :(得分:2)
我通常使用方法#1,因此我可以将HTML放在包含静态HTML的模板文件中。我试着从我的PHP中保留尽可能多的HMTL。它使PHP更清晰,更短,因为模板通常是一个单独的文件。
关于速度/性能,我认为差异很小。使用输出缓冲,它也一直在扩大变量,虽然该变量不可访问,但必须存储在某处。
我经常想知道打开和关闭<?php
是否慢于将其全部置于<?php
内,然后立即回复所有内容。
我认为最后我们在非常复杂的脚本中谈论毫秒。
哦,是的,方法#1更灵活,因为你可以echo $html;
任何地方。
答案 2 :(得分:2)
这有点旧,但Sara Golemon的this post可能会有所帮助。 AFAIK输出缓冲功能非常快速有效,echo
也是如此,所以我会使用它。
答案 3 :(得分:1)
在不断修改变量并重新打印变量时,确实存在轻微的开销。但是,不这样做意味着在某些时候脚本可能会完成运行(由于中断或类似),并且顺序echo语句将部分打印页面而不是任何内容。
答案 4 :(得分:1)
我打算写一篇关于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);
答案 5 :(得分:1)
只是几个想法:
输出缓冲可以使您的页面看起来很慢,因为用户在整个脚本运行之前都没有看到任何内容(尽管您拥有#1设置的方式也是如此)。
php中的字符串是可静音的,因此连接并不像其他语言那样糟糕。话虽如此,输出缓冲可能只是稍微快一点,因为默认情况下为输入分配的空间相当大(根据this为40K)
最后我会说这更像是一种风格问题。如果你喜欢什么输出缓冲购买,那么它可能是要走的路。
答案 6 :(得分:1)
您的问题的答案也可以在这里找到:php: output[] w/ join vs $output .=
字符串连接是构建字符串的最快方法。
我没有测试过“echo”vs字符串构建,但只要你没有使用缓冲输出,由于顺序写入自刷新缓冲区,回应应该是最快的。 (只有在刷新时才会减速,即使你提前进行字符串连接,也不会真正避免)
答案 7 :(得分:0)
我还没有提到的一点是,通常情况下,PHP人员必须与需要对HTML进行分类或以其他方式添加样式的设计人员合作,因此解决方案必须记住这一点。