【问题标题】:Laravel Excel queued export isn't creating jobsLaravel Excel 排队导出没有创造工作
【发布时间】:2019-12-17 00:16:23
【问题描述】:

我正在尝试让排队的导出与 Laravel Excel 包一起使用,但无法弄清楚我缺少什么。我遵循how to queue exports 上的文档,但是当我测试它时,导出在第一批导出后完成,因此在前 1000 行之后。我将我的应用程序设置为在 .env 中使用 database driver 并生成/运行迁移。

我正在使用 Laravel 5.8、Laravel Excel 3.1、PHP 7.2、Postgresql 10。这是我目前所拥有的基本版本:

控制器

public function export(Request $request){
    $name = 'test.csv';
    (new ExcelExport($client, $year))->queue('public/exports/' . $name)->chain([
        new NotifyUserOfExport($request->user(), $name),
    ]);

    return back()->with('message', 'This export will take some time. You will receive an email when it is ready to download.');
}

导出类

class ExcelExport implements FromQuery, WithHeadings, WithMapping, WithStrictNullComparison
{
    use Exportable;

    public function __construct($client, $year)
    {
        $this->year = $year;
        $this->client = $client;
    }

    public function query()
    {
        $query = $this->getQuery();

        return $query;
    }

    public function headings(): array
    {
        //...
    }

    public function map($row): array
    {
        //....
    }

    private function getQuery()
    {
        return \DB::table('mytable')
                  ->where('year', $this->year)
                  ->where('client', $this->client)
                  ->orderBy('created_at')
                  ->groupBy('column');
    }

我的队列.php

return [
    'default' => env('QUEUE_CONNECTION', 'sync'),
    'connections' => [
        'sync' => [
            'driver' => 'sync',
        ],
        'database' => [
            'driver' => 'database',
            'table' => 'jobs', // also tried 'myschema.jobs'
            'queue' => 'default',
            'retry_after' => 90,
        ],
        //.....
    ],

我的 .env

QUEUE_CONNECTION=database

我认为没有任何其他相关的代码。我收到了应该在所有作业完成后发送的通知,但就像我之前提到的,它是在第一批完成后发送的。数据库中的作业表中也没有插入作业,因此存在问题。我只是无法弄清楚我错过了什么。

我应该提到我不想使用Implicit Export queueing,因为同样的导出用于应用程序的另一部分,只需要导出几行,所以我不需要排队.

任何帮助将不胜感激。

【问题讨论】:

    标签: php excel laravel laravel-excel


    【解决方案1】:

    事实证明,因为我的查询有一个 groupBy 子句,我需要在导出类上实现 a custom query size。我不明白为什么这是个问题,但是在我添加之后,作业被添加到队列中并且处理得很好。所以我补充说:

        use Maatwebsite\Excel\Concerns\WithCustomQuerySize;
    
        class ExcelExport implements ...., WithCustomQuerySize
    
        //......
    
        public function querySize(): int
        {
            $query = //......
    
            $size = $query->count();
            return $size;
        }
    

    我希望这对某人有所帮助,这样他们就不必经历我做的头痛。

    【讨论】:

      【解决方案2】:

      排队的可导出文件以块的形式处理;每个块都是由 QueuedWriter 推送到队列的作业。对于实现 FromQuery 问题的可导出文件,作业数是通过将 $query->count() 除以块大小来计算的。

      #何时使用

      根据 query() 方法的实现(例如,使用 groupBy 子句时),前面提到的计算可能不正确。

      如果是这种情况,您应该使用 WithCustomQuerySize 关注点来提供查询大小的自定义计算。

      在此处了解更多信息https://docs.laravel-excel.com/3.1/exports/queued.html#when-to-use

      【讨论】:

        猜你喜欢
        • 2021-02-16
        • 2021-05-01
        • 1970-01-01
        • 2023-02-02
        • 1970-01-01
        • 2021-09-01
        • 1970-01-01
        • 2016-10-27
        • 2018-01-29
        相关资源
        最近更新 更多