我正在将数据从 MySQL 数据库表导出到 Excel 文件。但导出大量数据时显示内存限制错误。
我已将php.ini
文件中的内存限制设置为 1024M,并且现在它运行良好,因为它现在有 300,000 条记录/行。
但这个数字会不断增长,所以我在 PHP 文件中使用了以下代码。但我不确定这样做是否正确。我希望它不会影响我的任何功能。
ini_set("memory_limit",-1);
下面是我用来从 Excel 数据库导出数据的代码:
ini_set("memory_limit",-1);
if (isset($_POST["export"])) {
$query_discount = "SELECT * FROM tb_discount";
$productResult1 = mysql_query($query_discount, $con);
$filename_discount = "Discount_data_report.xls";
header("Content-Type: application/vnd.ms-excel");
header("Content-Disposition: attachment; filename=\"$filename_discount\"");
$isPrintHeader_discount = false;
if (! empty($productResult1)) {
while ($row_discount = mysql_fetch_assoc($productResult1)) {
if (! $isPrintHeader_discount) {
echo implode("\t", array_keys($row_discount)) . "\n";
$isPrintHeader_discount = true;
}
echo implode("\t", array_values($row_discount)) . "\n";
}
}
exit();
}
答案1
memory_limit
除非真的需要,否则不要增加 PHP ,并且只在需要该限制的代码部分或文件中进行此操作。
一般来说,这完全取决于您的代码,并且 PHP 脚本不会占用大量内存。
PHP 脚本在运行时只会占用内存。因此,如果这是在 Apache 服务器上,如果您一概删除 memory_limit
阻止,那么任何使用您网站的人都可能通过向您的网站发送大量请求来对您的网站进行 DDoS 攻击,这些请求会任意填满您服务器上的 RAM,直到该网站无法使用。即使您从命令行使用此脚本(即您在需要时自己运行它),这也被视为不好的做法。
但有一个可行的解决方案。
只需添加该ini_set("memory_limit",-1);
指令仅有的对于绝对需要它的脚本或代码块。
因此,如果您的 Excel 导出代码在一个特定文件中运行,只需将其添加ini_set("memory_limit",-1);
到该文件即可。或者,如果您有更复杂的代码,Excel 导出是其中的一部分,最好将其放在ini_set("memory_limit",-1);
处理导出的代码区域中仅有的而不在其余的代码中。
因此,如果您有一个处理导出的函数或方法,只需将其放在ini_set("memory_limit",-1);
该函数或方法中即可。或者,也许您有一个if
导出条件?那么只需将其放在条件区域ini_set("memory_limit",-1);
中即可if
。
归根结底,诸如此类的事情memory_limit
都是有原因的;它们不是你的敌人。总是以一种允许它们有一个限制的方式来调整它们,仅有的如果某项任务或条件确实需要,则解除该限制。
因此,对于您的示例代码,我建议将以下两行更改为:
ini_set("memory_limit",-1);
if (isset($_POST["export"])) {
对此:
if (isset($_POST["export"])) {
ini_set("memory_limit",-1);
这样,memory_limit
只有当您明确且确定地进行出口时,您才可以取消限制。
而过去这一切……
您的代码存在明显的可扩展性问题。
重构您的代码,以便它可以正确扩展而不会达到内存限制。
在没有看到您的代码的情况下,似乎您只是在进行没有OFFSET
或的全面 MySQL 查询LIMIT
,这会导致问题。相反,我会记录您重构代码以在 MySQL 代码中使用OFFSET
或LIMIT
,然后将结果附加到导出的 Excel 文件中。这样您就不必担心 PHP 内存限制,并可以更好地扩展代码。
类似foreach
PHP 循环的东西,可以调整OFFSET
或LIMIT
以某个设定为基础(比如说)每次循环 1,000 条记录,然后将数据附加到该 Excel 文件。这是更好、可扩展且更可靠的长期解决方案。