【问题标题】:PHP is very slow when printing a large amount of information打印大量信息时PHP很慢
【发布时间】:2011-04-12 13:07:21
【问题描述】:

我有一个应用程序,我需要从数据库中检索大量行,然后将它们全部打印在屏幕上。我检查了 mysql 查询,这不是问题所在。问题是所有行都需要打印在同一页上,没有分页,而且需要很长时间(我说的是一个有几千行的表)。有什么办法可以加快速度吗?我在 Google 上发现的唯一内容是使用“,”而不是“。”使用回声时。我将对此进行测试以查看是否有任何改进,但我不确定它会产生如此大的不同。

【问题讨论】:

  • 你确定是 PHP 速度慢,而不是传输一个巨大的 HTML 文件?
  • 我认为有一个设置可以让它在 PHP 完成执行之前开始发送文件......
  • 嗨,看看这个:php.net/manual/en/book.outcontrol.php 确保你没有缓冲你的输出。
  • 尝试使用浏览器以外的方式下载脚本的输出。比如命令行 curl 或 wget。很可能您的“长时间”实际上是浏览器努力解析/呈现该大小的表格,而不是缓慢的脚本或网络连接。
  • 我的钱花在浏览器上,让你的怪物桌上窒息。

标签: php performance printing


【解决方案1】:

问题不太可能是 PHP,而是大量的 HTML 输出到浏览器。您可以自己验证这一点,方法是保存获得的页面,然后从硬盘加载静态文件。

如果您要输出一个大表格,那么浏览器在加载内容时通常会遇到“重绘”它的问题。这可以通过为所有列设置固定宽度来最小化。只需在第一行执行此操作即可。

您还可以跳出 PHP 块以输出大部分 HTML,然后在适当的地方打印变量。这是一个示例,假设您的所有数据都在 $rows 变量中:

<?php
  // some code here
?>

<table>
<thead>
<tr>
  <th width="50">Header 1</th>
  <th width="200">Header 2</th>
  <th width="150">Header 3</th>
  <th width="100">Header 4</th>
</tr>
</thead>
<tbody>
<?php foreach ( $rows as $r ) : ?>
<tr>
  <td><?=$r['var1']?><td>
  <td><?=$r['var2']?><td>
  <td><?=$r['var3']?><td>
  <td><?=$r['var4']?><td>
</tr>
<?php endforeach; ?>
</tbody>
</table>

<?php
  // continue here if necessary

注意:如果您没有启用 PHP 短标签,则需要改为 &lt;?php echo $r['var1'] ?&gt;

最后,您可以尝试添加 gzip 压缩。最好在服务器级别完成,但在 PHP 中,您可以在 &lt;?php 之后添加行 ob_start("ob_gzhandler"); 作为 PHP 代码的第一行。

如果这仍然没有帮助,那么很简单,您的桌子太大了。最好使用分页或过滤来减小大小。

【讨论】:

  • 经过几次测试后,似乎虽然有些优化会加快速度,但主要问题是表的大小。所以我只需要说服他们在那里做某种分页。之前没有考虑过列宽,表中有些列没有固定宽度。我会改变它,看看它是否有帮助。谢谢。
  • 一个小的改进可能是将其分解为更小的表格...每 50 个左右的项目,开始一个新表格。您可以对其进行样式设置,使其看起来无缝。
  • 对于类似的问题,我必须创建一个 C++ PHP 扩展来渲染表格。与 PHP 代码相比,它快如闪电。另一个问题是,在渲染过程中 PHP 会消耗大量 CPU,给服务器带来高负载。
【解决方案2】:

PHP 不是您的瓶颈。这是我参加过的关于 PHP 性能的 presentation,由创建 PHP 的人 Rasmus Lerdorf 撰写。 PHP 是您在性能方面最不必担心的事情之一。您可以打印数百万行条目并毫无问题地进行复杂计算。在将其扔给 PHP 之前,请检查您的代码、查询、网络服务器设置。

正如 Mark 建议的那样,您可以使用 flush 将输出发送到浏览器,同时仍从 db 获取信息。

【讨论】:

  • 感谢您的介绍,非常有用。我一直在检查代码和查询并进行了一些优化,但这似乎还不够。我会考虑使用flush,看看这是否能让事情变得更好。
  • 那么你应该举一个快速执行 PHP 代码的例子。将所有人重定向到演示文稿并没有多大帮助。
  • 所以我的评论被否决了......在演示文稿的第 18 张幻灯片上,“我们看到数据库是瓶颈,它应该是。”尽管 32.39% 的时间都花在了数据库上。我创建了一个 C++ PHP 扩展来从数据库中的大量行呈现 HTML,并且 99% 的时间都花在了数据库上。
猜你喜欢
  • 2019-02-23
  • 1970-01-01
  • 2016-11-25
  • 2018-05-06
  • 1970-01-01
  • 2015-09-08
  • 1970-01-01
  • 2011-12-23
  • 1970-01-01
相关资源
最近更新 更多