【问题标题】:Laravel Excel - Error Allowed memory sizeLaravel Excel - 错误允许的内存大小
【发布时间】:2018-04-05 14:12:53
【问题描述】:

我使用Maatwebsite 加载excel 文件。我正在加载好几个文档,直到它给出下一个错误:

PHP Fatal error:  Allowed memory size of 134217728 bytes exhausted (tried to allocate 32 bytes) in /project1/vendor/phpoffice/phpexcel/Classes/PHPExcel/Cell.php on line 582

我去了config/excel.php 并将memoryCacheSize 设置更新为128MB。之后我运行php artisan cache:clearphp artisan config:cache。再次尝试加载并返回相同的错误。

我该如何解决?

【问题讨论】:

  • 你的excel文件太大了?顺便说一句,也分享代码,不仅仅是错误。
  • 您需要将php.ini 中的memory_limit 增加为256M
  • 我把主文件分成几个小文件。而且它以前运行良好,所以我认为这与代码无关。我想我必须清理关于 maatwebsite 或 phpexcel 库的缓存,但是如何? @Troyer

标签: php laravel phpexcel maatwebsite-excel


【解决方案1】:

将此添加到您的 index.php 文件中。

ini_set('memory_limit', '-1');

【讨论】:

  • M 在一段时间内它工作得很好。但是现在不起作用...将我返回到一个有 10 行的文件,对于一个有 1000 行的文件,它不会开始加载文件...
  • -1 表示将分配尽可能多的可用内存。一定会返回一些错误。把它贴在这里我们可以找到它。我遇到了问题,因为几天后临时目录不可写。所以我把温度改到了某个地方。它的工作。只需发布您遇到的错误。
【解决方案2】:

你必须增加 PHP 的内存限制。你有很多方法可以做到这一点。

首先,如果你想检查实际内存限制,你需要创建一个 PHP 文件(我们可以将其命名为 php.php)或将其放入任何控制器内的操作中,并在其中放入以下代码:

<?php phpinfo(); exit;?>

第一种改变memory_limit的方法,这种方式修改所有在PHP中运行的项目的momooty_limit:

首先你需要找到你的 php.ini,这个数据在 phpinfo();

  1. 编辑 php.ini。在 php.ini 中搜索“memory_limit”,然后更改它的值。如果没有找到“memory_limit”,则在 php.ini 末尾添加以下行 memory_limit = 128M ; /* 根据需要更改 128M */ 保存文件。

  2. 重置 apache。

    sudo service apache2 重启

第二个选项是把它放在你的 laravel 项目中的 index.php 中,就像@Giri Annamalai M 上面告诉你的那样。

ini_set('memory_limit', '-1');

此选项将修改所有项目的内存限制...如果您输入-1,则表示没有限制。(取决于计算内存)

其他选项是在控制器中指示内存限制,在动作内部指示内存限制:

ini_set('memory_limit', '-1');

请记住,-1 始终没有限制。也许这不是指示内存限制的最佳安全和性能方式。您还有其他方法来编辑内存,例如 .htaccess... 但我认为第 3 种方法是这个位置中最好的方法之一。

【讨论】:

    【解决方案3】:

    我建议对较大的文件使用 box/spout。由于文件类型的灵活性,我都使用过,并且通常将 Maatwebsite 用于较小的文件。

    https://github.com/box/spout

    【讨论】:

    【解决方案4】:

    我做了一些调试,看看哪些场景会降低 Laravel Excel 的内存使用量。

    我在使用 DTO 时的最佳结果,它只包含简单的变量类型。 将 Carbon 或 BigDecimal 等对象转换为字符串也节省了一些内存使用量。

    在 Export 中,您可以删除 withMapping 特征,因为 DTO 属性会为您解决这个问题。如果您愿意,您可以更改 DTO 属性的顺序。

    并删除 ShouldAutoSize 特征,as suggested by the maintainer

    例如

    class Row {
      public int $id;
      public string $created_at;
    }
    
    class UserExport implements FromCollection
    {
        public function collection()
        {
            $users = User::query()->all();
    
            return $users->map(
                function ($user) {
                    $row = new Row();
                    $row->id = $user->id;
                    // cast objects like Carbon or BigDecimal to string
                    $row->created_at = $entry->created_at->format('d-m-Y');
    
                    return $row;
                }
            );
        }
    }
    

    【讨论】:

      【解决方案5】:

      在 2021 年版本 3.1 中不起作用。

      我得到了它与WithChunkReading 的合作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-08
        • 2015-04-22
        • 2023-03-20
        • 2015-09-18
        • 2023-04-03
        • 1970-01-01
        相关资源
        最近更新 更多