【问题标题】:How to execute multiple artisan commands without waiting for one to end execution?如何在不等待一个结束执行的情况下执行多个工匠命令?
【发布时间】:2018-06-30 01:54:29
【问题描述】:

我有大量数据想要快速处理并充分利用我的服务器。因此,我创建了一个父工匠命令和一个子工匠命令

父工匠命令:从数据库中获取值,进行各种计算,将数据分成块并使用以下代码执行子工匠命令的多个实例.

foreach($arrayOfData as $chunk){ // $arrayOfData is an array of Chunks
    $this->call('process:data',[
        'data' => $chunk  // Chunk is an array containing data
    ]);

    $this->info('Chunk Processed');
}

但它会等待一个实例停止执行,这意味着它不会一次执行我想要的多个子工匠命令实例!我知道以这种方式调用它会等待子工匠命令的一个实例停止执行。有什么方法可以执行child artisan command 的多个实例而无需等待一个实例停止执行?

我已经搜索了不同的方法来执行此操作,我可以使用 exec() 和类似函数执行子工匠命令,但它也会返回一些我的代码将等待的退出代码。

通过一次只执行 2 个实例,我可以将处理数据所花费的时间除以 2。我想一次执行 3 个实例!有没有办法做到这一点?

更多信息

Child artisan command:获取数据数组并对其进行处理。基本上,它会针对给定数据更新数据库中的一些信息。

【问题讨论】:

    标签: php laravel laravel-5 laravel-artisan


    【解决方案1】:

    来自the docs

    使用 Artisan 外观上的 queue 方法,您甚至可以对 Artisan 命令进行排队,以便队列工作人员在后台处理它们。在使用此方法之前,请确保您已配置队列并正在运行队列侦听器

    foreach($arrayOfData as $chunk){ // $arrayOfData is an array of Chunks
        $this->queue('process:data',[
            'data' => $chunk  // Chunk is an array containing data
        ]);
    }
    

    如果您不熟悉队列,请从here 开始。

    【讨论】:

    • 是的!现在我正在尝试了解队列。一开始他们有点难,并且出现了一些错误,但是是的,这就是答案!
    猜你喜欢
    • 1970-01-01
    • 2018-04-03
    • 2017-05-27
    • 2021-12-24
    • 2019-02-01
    • 1970-01-01
    • 2015-05-17
    • 2023-03-06
    • 2019-05-04
    相关资源
    最近更新 更多