Laravel重复延迟工作

时间:2019-03-22 16:44:04

标签: php mysql laravel memory-leaks delayed-job

我正在使用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));
    }
}

因此,如您所见,如果管理员未修改记录,那么我将在上一个作业完成后启动作业,并且我需要再次运行循环。经过几个周期后,我将不再运行作业,因此它将完成。

我的问题:

此实现中有问题吗?也许我做错了事,或者可能发生了某种类型的内存泄漏(因为我一次又一次地在job内创建job)。我可以编写此代码,但我需要确保此实现不会导致某种类型的错误或错误。

1 个答案:

答案 0 :(得分:0)

为什么不为此目的在数据库中创建单独的表?

您可以保留order_ids的状态(由admin选中/未选中)。或者只是将新的order_id放在此处,并在管理员检查后将其删除。因此,您将仅使用作业来查看是否存在任何未检查的ID。或某种。

我认为这种方法更具可预测性,并且没有太多错误。