AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / computer / 问题 / 1447510
Accepted
Nilofar
Nilofar
Asked: 2019-06-12 09:07:37 +0800 CST2019-06-12 09:07:37 +0800 CST 2019-06-12 09:07:37 +0800 CST

如果我使用 ini_set("memory_limit",-1); 可以吗?在我的 php 文件中

  • 772

我正在将数据从 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();
}
php xampp
  • 1 1 个回答
  • 3296 Views

1 个回答

  • Voted
  1. Best Answer
    Giacomo1968
    2019-06-12T09:24:53+08:002019-06-12T09:24:53+08:00

    不要增加 PHP memory_limit,除非你真的必须并且只在需要该限制的代码部分或文件中这样做。

    一般来说,这完全取决于您的代码,并且 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在清楚明确地进行导出时才每次都取消限制。

    过去的任何一个……

    您的代码存在明显的可扩展性问题。

    重构您的代码,使其可以在不达到内存限制的情况下适当扩展。

    在没有看到您的代码的情况下,您似乎只是在不使用OFFSETor进行全面的 MySQL 查询LIMIT,这会导致您出现问题。相反,我会记录您重构代码以在 MySQL 代码中使用OFFSET或使用LIMIT,然后将结果附加到导出的 Excel 文件中。这将使您不必担心 PHP 内存限制并允许您更好地扩展代码。

    类似于foreachPHP 循环的东西,它在一组基础上调整OFFSETor LIMIT,比方说,每个循环 1,000 条记录,然后将数据附加到该 Excel 文件。这是更好、可扩展且更可靠的长期解决方案。

    • 2

相关问题

  • 连接重置后的文件上传结果

  • Apache 两次发送 POST 请求

  • MediaWiki 非主题依赖 CSS

  • 为什么我的 php 文件不能在 xamppp 上运行?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    Windows 照片查看器因为内存不足而无法运行?

    • 5 个回答
  • Marko Smith

    支持结束后如何激活 WindowsXP?

    • 6 个回答
  • Marko Smith

    远程桌面间歇性冻结

    • 7 个回答
  • Marko Smith

    Windows 10 服务称为 AarSvc_70f961。它是什么,我该如何禁用它?

    • 2 个回答
  • Marko Smith

    子网掩码 /32 是什么意思?

    • 6 个回答
  • Marko Smith

    鼠标指针在 Windows 中按下的箭头键上移动?

    • 1 个回答
  • Marko Smith

    VirtualBox 无法以 VERR_NEM_VM_CREATE_FAILED 启动

    • 8 个回答
  • Marko Smith

    应用程序不会出现在 MacBook 的摄像头和麦克风隐私设置中

    • 5 个回答
  • Marko Smith

    ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] 证书验证失败:无法获取本地颁发者证书 (_ssl.c:1056)

    • 4 个回答
  • Marko Smith

    我如何知道 Windows 安装在哪个驱动器上?

    • 6 个回答
  • Martin Hope
    Albin 支持结束后如何激活 WindowsXP? 2019-11-18 03:50:17 +0800 CST
  • Martin Hope
    fixer1234 “HTTPS Everywhere”仍然相关吗? 2019-10-27 18:06:25 +0800 CST
  • Martin Hope
    Kagaratsch Windows 10 删除大量小文件的速度非常慢。有什么办法可以加快速度吗? 2019-09-23 06:05:43 +0800 CST
  • Martin Hope
    andre_ss6 远程桌面间歇性冻结 2019-09-11 12:56:40 +0800 CST
  • Martin Hope
    Riley Carney 为什么在 URL 后面加一个点会删除登录信息? 2019-08-06 10:59:24 +0800 CST
  • Martin Hope
    zdimension 鼠标指针在 Windows 中按下的箭头键上移动? 2019-08-04 06:39:57 +0800 CST
  • Martin Hope
    Inter Sys Ctrl+C 和 Ctrl+V 是如何工作的? 2019-05-15 02:51:21 +0800 CST
  • Martin Hope
    jonsca 我所有的 Firefox 附加组件突然被禁用了,我该如何重新启用它们? 2019-05-04 17:58:52 +0800 CST
  • Martin Hope
    MCK 是否可以使用文本创建二维码? 2019-04-02 06:32:14 +0800 CST
  • Martin Hope
    SoniEx2 更改 git init 默认分支名称 2019-04-01 06:16:56 +0800 CST

热门标签

windows-10 linux windows microsoft-excel networking ubuntu worksheet-function bash command-line hard-drive

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve