我正在使用 MySQL 编写 Laravel json api。我想做的是,每当用户创建记录时,我想每 24 小时对此记录执行一些操作,直到管理员对此记录进行一些更改。所以平均这个工作会重复10-15次。这是我的工作:
<?php
namespace App\Jobs;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use App\Http\Models\Orders\RoadOrder;
class RoadOrderEprirationHandler implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
/**
* Create a new job instance.
*
* @return void
*/
protected $order_id;
public function __construct($order_id)
{
$this->order_id = $order_id;
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
$order = RoadOrder::findOrFail($this->order_id);
//do some tasks and if I need to run this cycle again :
$roadOrderEprirationHandler = new RoadOrderEprirationHandler($order->id);
$roadOrderEprirationHandler->dispatch($order->id)->delay(now()->addHours(24));
}
}
正如您所看到的,如果管理员没有修改记录,我会在上一个作业完成后启 Action 业,并且我需要再次运行循环。几个周期后,我不会再运行作业,所以它会完成。
我的问题:
这个实现有什么问题吗?也许我做错了什么,或者可能会发生某种类型的内存泄漏(因为我一次又一次地在作业中创建作业)。我可以写这个,但我需要确保这个实现不会导致某种类型的错误或错误。
最佳答案
为什么不在数据库中为此目的创建一个单独的表?
您可以保留 order_ids 的状态(由管理员检查/未检查)。或者只是将新的 order_id 放在那里并在管理员检查后将其删除。所以你只会使用你的作业来查看是否有任何未经检查的 ID。或者某种那样的。
我认为这种方法更可预测并且错误更少。
关于php - Laravel 重复延迟工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55304249/