laravel 使用excel导出6000行数据服务器出现500错误?

项目使用的是laravel5.1,使用的是laravel 推荐的excel类,Maatwebsite/Laravel-Excel,说起来只是导出6000行数据,我查了数据表才1.5mb,不知道为什么就无法导出,代码如下:



Excel::create('用户', function ($excel) use ($cellData) {
        $excel->sheet('用户', function ($sheet) use ($cellData) {
            foreach(array_chunk($cellData, 100) as $item){
                $sheet->rows($item);
            }
        });
})->export('xlsx');
    

$cellData 是需要保存导入数据的数组,而且我开始以为是一次执行需要内存太大了,所以使用了array_chunk来分步导入,还是会报500错误,只有当数据量减少到1000行,就可以正常执行导入操作然后下载,请问大家有什么办法呢?
无法使用php.ini里的memory_limit,因为使用的是php-fpm,而它的最大内存设置为64m,报错信息:

    PHP Fatal error:  Allowed memory size of 67108864 bytes exhausted (tried to allocate 65536 bytes) in /project/xxx.com/vendor/composer/ClassLoader.php on line 444
    

请问大家有好的解决方案吗?

阅读 7.2k
4 个回答

内存溢出了,laravel的话,我记得可以用游标控制内存,就是从数据库读取的时候。你的问题应该不是出现在导入到excel的时候,而是出现在从数据库拿出数据的时候。(补充:包括了你所有声明的变量,重复的赋值。这些空间复杂度)此时所有数据都是存储在内存中。laravel的游标(cursor文档

内存溢出同楼上。简单来说就是分批操作,避免一次性加载这么多数据到内存。array_chunk

新手上路,请多包涵

? 使用 chunk 可以解决这个问题,导出的结果会在多个sheet里,代码如下:

Excel::create(self::ACTIVITY_NAME.'_order_'.date('Y-m-d-H-i-s'), function($excel) {

        OrderMod::chunk(2000, function ($arr) use ($excel) {
            $excel->sheet(self::ACTIVITY_NAME, function($sheet) use ($arr){
                $sheet->freezeFirstRow();
                $sheet->row(1,  ['姓名', '电话']);
                $index = 1;
                foreach($arr as $val) {
                    $index = $index + 1;
                    $temp = [];
                    $temp[0] = $val['name'];
                    $temp[1] = $val['phone'];
                    $sheet->row($index, $temp);
                }
            });
        });
    })->download('xlsx');
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题