[英]Laravel dispatch same job with chain with different id and delay
我是 php/laravel 的新手,試圖了解調度方法。
我在數千條數據的長循環中使用調度,在循環結束時他運行:
RunDispatch::dispatch($id)->delay($Time);
因此,dispatch 被執行了數千次,變量 $Id 和 $Time 每個都不同,這就是問題所在,我想知道如何使用來自同一連接的不同 'id' 鏈同時運行所有 dispatch並在主循環之后“延遲”,開始我在循環結束時構建一個數組:
array_push($ArrayToDispatch, array($id => $Time));
因此,我得到一個包含所有 $id 和 $Time 的數組,如下所示:
Array
(
[0] => Array
(
[id1] => Time1
)
)
Array
(
[1] => Array
(
[id2] => Time2
)
)
我想知道是否可以為每個鏈插入具有不同 ID 和延遲的鏈,例如:
RunDispatch::dispatch(array_keys($ArrayToDispatch))->delay(array_value($ArrayToDispatch))
每個 array_keys 和 array_value 都是不同的,我試圖操縱方法 chain() 和 withChain(),類似於:
RunDispatch::chain([
....,
])->dispatch();
問題是我不知道如何使用這些方法插入不同的 $id 和 $delay,我嘗試了幾種組合但沒有成功。
謝謝你們
我認為你可以使用batches
。 你可以在這里閱讀
這是文檔中的一個簡單示例
$batch = Bus::batch([
new ImportCsv(1, 100),
new ImportCsv(101, 200),
new ImportCsv(201, 300),
new ImportCsv(301, 400),
new ImportCsv(401, 500),
])->then(function (Batch $batch) {
// All jobs completed successfully...
})->catch(function (Batch $batch, Throwable $e) {
// First batch job failure detected...
})->finally(function (Batch $batch) {
// The batch has finished executing...
})->dispatch();
你可以看到我們一起調度了多個作業,完成后,有回調可以開始收集你的數組。
使用批處理,您的作業將並行運行。 另外,如果需要,您可以為每項工作添加延遲
(new ImportCsv(1, 100))->delay($time)
您可以生成作業對象數組,然后通過batch
方法運行它們
$jobs = [];
//Here you can start the loop by your data
foreach ($myArray as $item) {
$jobs[] = (new ImportCsv($item['id']))->delay($item['time']); //This is just example
}
// Here you can pass the jobs. Jobs will start only after batching.
$batch = Bus::batch($jobs)->then(function (Batch $batch) {
// All jobs completed successfully...
})->catch(function (Batch $batch, Throwable $e) {
// First batch job failure detected...
})->finally(function (Batch $batch) {
// The batch has finished executing...
})->dispatch();
謝謝@Aro,你的解決方案有效,另一方面,你的解決方案沒有考慮延遲,所有的工作都是同時發送的(我不知道是什么原因),所以我用另一種方法來處理我的問題是,在擁有包含所有數據的數組后,我在一項新工作上使用 redis 驅動程序(比 mysql 快得多)運行調度,該工作負責在后台使用塊方法執行 mysql 插入,以免使 mysql 服務器過載,這使腳本即時。
在 controller 中,我填充數組:
array_push($ArrayToDispatch, array($id => $Time));
然后:
NewJob::dispatch($ChunkInsertToMs)->onConnection('redis');
在新工作(NewJob)中:
public function handle()
{
$chunks = collect($this->ChunkInsertToMs)->chunk(500);
foreach ($chunks as $chunk) {
foreach ($chunk as $item) {
RunDispatch::dispatch($id)->delay($item["Time"]);
}
}
}
謝謝你們
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.