微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Laravel 导出 500,000 行

如何解决Laravel 导出 500,000 行

我正在使用 https://docs.laravel-excel.com/3.1/exports。我在导出 500,000 行时遇到问题。 我正在使用队列来处理导出。它适用于 10K 记录。在处理 500,000 条记录并运行 PHP artisan queue:work --timeout=86000 以执行作业时,正在发生注释。

知道如何使 ma​​atwebsite excel 为 500,000 条记录导出工作吗?附上了我的代码快照。

我的控制器

public function getDownload(Request $request)
{
    (new TagsExport)->queue('exports/tags' . date('Y-m-d H_i') . '.xlsx');
    echo back()->withSuccess('Export started!');
}

我的标签导出类

<?PHP

namespace App\Admin\Exports;

use Maatwebsite\Excel\Concerns\WithMultipleSheets;
use Maatwebsite\Excel\Concerns\Exportable;
use Maatwebsite\Excel\Concerns\FromQuery;
use Maatwebsite\Excel\Concerns\WithTitle;
use Maatwebsite\Excel\Concerns\Withheadings;
use Maatwebsite\Excel\Concerns\WithMapping;
use Maatwebsite\Excel\Concerns\WithCustomQuerySize;

use Tag;

class TagsExport implements FromQuery,WithTitle,Withheadings,WithMapping,WithCustomQuerySize
{
    use Exportable;

    /**
     * Get the sheet title
     *
     * @return string
     */
    public function title(): string
    {
        return 'Tags';
    }

    /**
     * Get the header rows
     *
     * @return array
     */
    public function headings(): array
    {
        return [
            'id','Name',];
    }


    public function query()
    {
        return Tag::query();
        
    }
    
    public function querySize(): int
    {
        $query = Tag::query();

        $size = $query->count();
        return $size;
    }

    public function chunkSize(): int
      {
         return 1000;
      }

    /**
     * Get the mapped results
     *
     * @param  Company $company
     * @return array
     */
    public function map($company): array
    {
        return [
            $company->id,$company->name,];
    }

    
}

解决方法

如果您的代码在 10.000 个寄存器上运行良好,但在 500.000 行时中断,我认为生成整个导出文件所需的时间比您预期的要多,对您来说似乎什么也没发生,但是队列确实发生了没有足够的时间来处理这一切。

您真的需要一个巨大的单个文件吗?你不能把你的转储分成多张纸吗?

[1~25000]
[25001 ~ 50000]
[50001 - 100000]
And so on...

这也可能与 PHP 允许使用的内存量有关(在这种情况下没有足够的内存)尝试在 php.ini 中更改它并再试一次。

希望对你有帮助=)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。