从查询数据构建html表...更快?

时间:2010-04-07 06:20:44

标签: php html loops html-table

凭借我有限的经验/知识,我使用以下结构从MySQL查询中动态生成HTML表格:

$c = 0;
$t = count($results);

$table = '<table>';

while ($c < $t) {
   $table .= "<tr><td>$results[0]</td><td>$results[1]</td> (etc etc) </tr>";
   ++$c;
}

$table .= '</table>';
显然,这很有效。但是对于具有300多行的表,当脚本构建表时,页面加载会有明显的延迟。目前最大结果列表只有大约1,100行,等待时间不长,但显然还有等待。

是否有其他方法可以输出比WHILE循环更快的HTML表格? (PHP只请......)

6 个答案:

答案 0 :(得分:5)

首先,可能缓慢是HTML呈现的结果,而不是PHP脚本。 其次,构建非常大的表不是很有用,最好使用分页。

您可以通过以下几种方式改善PHP方面的脚本性能:

  1. 使用ob_start();和ob_get_clean(); - 这样数据将立即传递给html:

    ob_start();
    // your code here
    echo ob_get_clean();
    
  2. 使用数组和连接字符串:

    $str = array();
    $str[] = 'add the strings';
    echo implode($str);
    
  3. BR。

答案 1 :(得分:2)

  

是否还有其他方法可以输出比我的WHILE循环更快的HTML表格?

可能是的。 PHP是一种模板语言。使用它,不要打它!本地模板可能比手动将字符串紧密地组合在一起更快 - 而且IMO更具可读性。

<table>
    <?php foreach($results as $result) { ?>
        <tr>
            <td><?php echo htmlspecialchars($result[0]); ?></td>
            <td><?php echo htmlspecialchars($result[1]); ?></td>
        </tr>
    <?php } ?>
</table>

(请注意htmlspecialchars的使用。如果您每次不使用此函数,则将纯文本插入HTML,您的代码会出现HTML注入缺陷,导致潜在交叉-site-scripting漏洞。您可以使用h这样的简短名称来定义一个函数echo htmlspecialchars以避免某些输入,但必须对您的字符串进行HTML编码。)

然而:虽然这更漂亮,更安全,但实际上不太可能快得多。您的客户端渲染速度几乎肯定会由以下因素引起:

  1. 许多表数据的网络传输速度。您可以通过为您的网络服务器部署zlib.output_compressionmod_deflate或其他压缩过滤器来改善这一点,如果您还没有。

  2. 大表的渲染速度。您可以通过在table-layout: fixed元素上设置CSS样式<table>并为要具有固定宽度的列添加带有显式<col>样式的width元素来改善这一点。< / p>

答案 2 :(得分:1)

我要尝试的第一件事是 - 不要连接你的字符串。在我使用的每种语言中,总是会因为不断地将字符串添加到一起并在最后吐出一个巨大的字符串而造成一点性能损失。

如果可以,请尝试使用多个echo语句。

另一个尝试 - 根据我自己的经验,我很确定for循环( for each)比while更快。我恐怕没有任何数字或证据支持这一点,就像我多年来所观察到的那样。

答案 3 :(得分:1)

这是浏览器问题,而不是PHP。 将表保存为HTML并打开它 - 结果将是相同的。

避免使用如此庞大的HTML表格。我建议使用一些分页,即将你的表分成较小的页面,比如SO做问题列表

答案 4 :(得分:0)

这可能是朝着正确方向迈出的一步。

http://eaccelerator.net/

答案 5 :(得分:0)

从xml文件加载它。以下是逻辑。

您知道何时更新表格。当表更新时写下所有必须在xml文件中显示的内容。当用户从xml文件加载页面加载数据时。这样,当用户加载页面时,您不必运行查询并迭代循环。这种方式更快。如果有效,请检查并回复。

如果您认为上述逻辑仍然很慢并且您有更多数据,请执行以下操作 - 页面加载时首先加载100个表数据。然后触发ajax请求并从xml文件中获取接下来的100个节点并显示它。再次完成后,激活ajax请求从xml文件中获取接下来的100个节点并在页面中显示它等等。