1

我正在使用PHPExcel库,它似乎做得很好,但在我的方法中,它似乎并没有那么快。

我需要生成一个带有分配表、数据、公式和样式(粗体、颜色、边框)的 excel 文件,这需要我分配计算资源和时间。
我认为我的方法不太好。当即将使用 PHP 代码和来自 mysql 数据库的数据生成这种文件(excel)时,必须是正确的顺序。

1) 生成所有没有格式/样式、没有公式、添加数据和公式和样式
的工作表 2) 生成带有数据的工作表、添加公式、添加样式
3)....

最好将数据库中的所有需要​​数据放在一个多维数组中,而不是每次我希望写入新工作表时都查询数据库?

我正在使用双核处理器机器和 4GB 或 RAM,如果 Apache 没有崩溃,我需要大约 1 分钟。

4

6 回答 6

2

我建议分析您的 PHP 代码以找出花费最多时间的地方。您可以在我的博客上找到有关使用 XDebug 分析 PHP conde 的分步教程。然后尝试优化最耗时/最频繁调用的部分。您可以做的最好的优化之一是尽可能用内置函数替换 PHP 方法,因为它们的速度要快几个数量级。

于 2009-04-16T06:56:03.637 回答
2
  1. 让 mysql 进行计算:我曾经优化过一份报告,其中原始开发人员使用循环来计算总和而不是 sql sum 函数,它写得太糟糕了,超过了 php 的时间限制
  2. 确保你的计算 SQL 已经足够优化
  3. 计算然后生成内容
于 2009-04-26T23:56:06.833 回答
2

执行更多、更简单的查询比执行更少、更复杂的查询要快。但是您需要对它们进行基准测试,因为这在很大程度上取决于您查询的数据。

也就是说,您可能会在 PHP 中遇到内存问题。我建议的是看看你是否可以重新安排数据处理算法。我要做的是一次只获取一个大型数据集,但已经由 MySQL 按照您需要处理它的顺序进行排序。然后,您可以使用无缓冲查询。

无缓冲的查询意味着客户端库在将其交给您的代码之前不会存储整个结果集。这意味着它可能比库通常处理的要大,但要使其正常工作,您的处理循环必须在每个周期从 API 获取一行 - 即这意味着每次都while()调用一个循环。mysql_fetch_assoc()

处理已经按您需要的顺序的结果集的另一个优点是,您可以要求比您需要的更多的东西,并在您进行时将其过滤掉。这在要求更多时有效,因为它较少被数据库过滤。

于 2009-04-27T00:14:52.950 回答
1

数据库查询,即使是返回 30,000 行的查询,通常只需要几分之一秒。使用这样的 proc 和 RAM,它可能会在 IO 处变慢。我敢打赌,大部分时间都花在了编写文件上。

话虽如此,我建议将所有数据放在前面。至少那时,你是从记忆中阅读的。我不确定 MySQL 是否使用指向当前行的指针将所有内容加载到内存中,或者它是否只加载当前行。

于 2009-04-15T21:57:43.543 回答
1

只需一分钟的处理时间,您的数据集听起来就不足以需要对结果集进行分区。

因此,假设,将其全部加载到内存中就可以了。

但是,mysql 无论如何都会缓存查询,因此连续的重复查询也不应该是一个大问题。

听起来确实像 IO 写入磁盘上的文件是你的慢点。我不太了解 xls 文件的样式和格式如何工作,但我很确定您可以通过减少格式或组织它来减少很多无意义的写入,这样您就不会进行任何内联格式,即使这样可能的。

我建议的最好的事情是优化您的查询。这通常是我遇到此类问题的第一个优化位置。如果您可以编辑您的帖子并包含我可以查看的 sql。(随意剪断敏感信息)

于 2009-04-16T00:03:08.123 回答
0

MySQL 将能够对数据执行任何计算/转换,而不是您的 PHP 层,因此我将编写一个查询来完成所有工作以获取一个电子表格的数据。

比对每个电子表格执行一次。

于 2009-04-24T11:01:33.577 回答