Laravel Excel 排队导出未创建作业
Laravel Excel queued export isn't creating jobs
我正在尝试让排队的导出与 Laravel Excel 包一起使用,但无法弄清楚我缺少什么。我遵循了 .env 中 how to queue exports, but when I test it the export completes after the first batch is exported, so after the first 1000 rows. I setup my application to use the database driver 和 generated/ran 迁移的文档。
我正在使用 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
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');
}
我的queue.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
我认为没有任何其他相关代码。我收到了应该在所有作业完成后发送的通知,但就像我之前提到的那样,它是在第一批完成后发送的。数据库中的作业 table 中也没有插入任何作业,所以有问题。我只是不知道我错过了什么。
我应该提到我不想使用 Implicit Export queueing,因为同一个导出用于应用程序的另一部分,它只需要导出几行,所以我不需要排队。
如有任何帮助,我们将不胜感激。
事实证明,因为我的查询有一个 groupBy 子句,所以我需要在导出 class 上实现 a custom query size。我不明白为什么这是个问题,但在我添加之后,作业被添加到队列中并得到了很好的处理。所以我补充说:
use Maatwebsite\Excel\Concerns\WithCustomQuerySize;
class ExcelExport implements ...., WithCustomQuerySize
//......
public function querySize(): int
{
$query = //......
$size = $query->count();
return $size;
}
我希望这对某些人有所帮助,这样他们就不必经历我所经历的头痛。
排队的可导出文件以块的形式处理;每个块都是由 QueuedWriter 推送到队列的作业。对于实现 FromQuery 关注点的可导出对象,作业数是通过将 $query->count() 除以块大小来计算的。
#什么时候使用
根据 query() 方法的实现(例如,当使用 groupBy 子句时),前面提到的计算可能不正确。
如果是这种情况,您应该使用 WithCustomQuerySize 关注点来提供查询大小的自定义计算。
在此处了解更多信息 https://docs.laravel-excel.com/3.1/exports/queued.html#when-to-use
我正在尝试让排队的导出与 Laravel Excel 包一起使用,但无法弄清楚我缺少什么。我遵循了 .env 中 how to queue exports, but when I test it the export completes after the first batch is exported, so after the first 1000 rows. I setup my application to use the database driver 和 generated/ran 迁移的文档。
我正在使用 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
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');
}
我的queue.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
我认为没有任何其他相关代码。我收到了应该在所有作业完成后发送的通知,但就像我之前提到的那样,它是在第一批完成后发送的。数据库中的作业 table 中也没有插入任何作业,所以有问题。我只是不知道我错过了什么。
我应该提到我不想使用 Implicit Export queueing,因为同一个导出用于应用程序的另一部分,它只需要导出几行,所以我不需要排队。
如有任何帮助,我们将不胜感激。
事实证明,因为我的查询有一个 groupBy 子句,所以我需要在导出 class 上实现 a custom query size。我不明白为什么这是个问题,但在我添加之后,作业被添加到队列中并得到了很好的处理。所以我补充说:
use Maatwebsite\Excel\Concerns\WithCustomQuerySize;
class ExcelExport implements ...., WithCustomQuerySize
//......
public function querySize(): int
{
$query = //......
$size = $query->count();
return $size;
}
我希望这对某些人有所帮助,这样他们就不必经历我所经历的头痛。
排队的可导出文件以块的形式处理;每个块都是由 QueuedWriter 推送到队列的作业。对于实现 FromQuery 关注点的可导出对象,作业数是通过将 $query->count() 除以块大小来计算的。
#什么时候使用
根据 query() 方法的实现(例如,当使用 groupBy 子句时),前面提到的计算可能不正确。
如果是这种情况,您应该使用 WithCustomQuerySize 关注点来提供查询大小的自定义计算。
在此处了解更多信息 https://docs.laravel-excel.com/3.1/exports/queued.html#when-to-use