Laravel Excel - 错误允许的内存大小

时间:2018-04-05 14:12:53

标签: php laravel phpexcel maatwebsite-excel

我使用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。再次尝试加载并返回相同的错误。

我该如何解决?

4 个答案:

答案 0 :(得分:3)

在index.php文件中添加它。

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

答案 1 :(得分:3)

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

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

<?php phpinfo(); exit;?>

更改memory_limit的第一种方法,这样修改在PHP中运行的所有proyects的momeoty_limit:

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

enter image description here

  1. 编辑php.ini。搜索&#34; memory_limit&#34;在你的php.ini中,并更改它的值。如果没有&#34; memory_limit&#34;发现,在php.ini的末尾添加以下行 memory_limit = 128M; / *根据您的需要改变128M * / 保存文件。

  2. 重置apache。

    sudo service apache2 restart

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

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

    此选项将修改所有proyect的内存限制...如果你输入-1,这意味着没有限制。(依赖于计算内存)

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

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

    请记住,-1总是无限制。也许这不是指示内存限制的最佳安全性和性能方式。你可以通过其他方式编辑内存,例如.htaccess ...但我认为第3种是这个世界中最好的之一。

答案 2 :(得分:1)

我建议使用盒子/喷口来放大文件。由于文件类型的灵活性,我使用了两者并且通常使用Maatwebsite来处理较小的文件。

https://github.com/box/spout

答案 3 :(得分:0)

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

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

在导出中,您可以删除 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;
            }
        );
    }
}