【问题标题】:Laravel custom Artisan command stops at 50 percent completionLaravel 自定义 Artisan 命令在完成 50% 时停止
【发布时间】:2021-09-08 04:05:19
【问题描述】:

所以我有一个自定义的工匠命令,我编写了该命令来填充一列并将其存储到一个新列中。我实现了一个进度条,由于某种原因,当命令完成 50% 时,它会跳转到 100%。问题是它只对一半数据执行了代码。

我正在使用 chunk() 函数将数据分成 1,000 行的块,以消除内存耗尽问题。这是必要的,因为我的数据集非常大。

我查看了我的 PHP 错误日志、MySQL 错误日志和 Laravel 日志。我找不到与此命令有关的任何错误或日志行。任何关于新地方的想法甚至可以开始寻找问题。

$jobTitles = ModelName::where($columnName, '<>', '')
            ->whereNull($slugColumnName)
            ->orderBy($columnName)
            ->chunk(1000, function($jobTitles) use($jobCount, $bar, $columnName, $slugColumnName)
        {
            foreach($jobTitles as $jobTitle) 
            {
                $jobTitle->$slugColumnName = Str::slug($jobTitle->$columnName);
                $jobTitle->save();
            }
            $bar->advance(1000);
        });
        $bar->finish();

【问题讨论】:

  • 如果没有看到或了解更多关于您的循环的信息
  • edit您的问题并在那里添加代码。 cmets 中的代码很难阅读/理解
  • 好吧,对不起就行了
  • @BrianThompson 我已按要求添加了代码

标签: php laravel laravel-artisan


【解决方案1】:

发生的情况是 whereNull($slugColumnName) 与回调设置相结合,$slugColumnName 导致后续循环中的结果丢失。

事件的顺序是这样的:

  • 获取第一组行:select * from table where column is null limit 100;
  • 对于每一行,将 column 设置为一个值。
  • 获取下一组行:select * from table where column is null limit 100 offset 100;
  • 继续并增加偏移量,直到没有更多结果。

这里的问题是,在第二步之后,您从总数中删除了 100 个结果。假设您从 1000 行开始,到第二个查询时,您现在只有 900 行匹配。

这会导致偏移从第 100 行开始似乎跳过整个块,而前 100 行尚未被触及。

更多官方文档请见this section of this section on chunking

我尚未对此进行测试以验证它是否按预期适用于您的用例,但似乎使用 chunkById 将解决此问题并更正您的结果。

【讨论】:

    猜你喜欢
    • 2016-12-20
    • 2021-08-11
    • 1970-01-01
    • 2016-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多