簡體   English   中英

Laravel 使用不同 ID 和延遲的鏈分派相同的作業

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM