如何在不等待终止执行的情况下执行多个artisan命令?

时间:2018-01-21 07:21:57

标签: php laravel laravel-5 artisan

我有大量数据需要快速处理并充分利用我的服务器。所以,我创建了一个父工匠命令和一个儿童工匠命令

父工匠命令:从数据库中获取值,执行所有类型的计算,将数据划分为块并使用以下代码执行子工匠命令的多个实例

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命令的实例停止执行。有没有办法可以执行child artisan command的多个实例而无需等待一个实例停止执行?

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

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

更多信息

儿童工匠命令:获取数据数组并对其进行处理。基本上,它会更新数据库中某些给定数据的信息。

1 个答案:

答案 0 :(得分:4)

来自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开始。