Laravel 5.4异步队列保存模型

5

我正在尝试优化我的网站,并在每次页面加载和退出时保存统计数据(停留时间、IP地址等)。但这些操作会对服务器造成相当大的负担。查看运行时间后,我的整个函数需要约1-2毫秒的时间,而将结果保存到数据库中需要约100-200毫秒。因此,我的目标是运行函数并分派一个新任务来实际保存指标。这样,所有模型的保存都可以转移到队列中进行。以下是我的工作副本。

class SaveMetric implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
    /**
     * Create a new job instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle(Metrics $metric)
    {
        //
        $metric->save();
    }
}

然后在我的控制器函数中,当我获取到所有需要的值后,我运行以下代码

dispatch(new SaveMetric($newMetric));

这段代码似乎可以运行,但好像没有任何作用。我是否遗漏了什么?(编辑)它确实有“作用”,只是将一个记录保存到数据库中,所有字段都为null,就像我创建了一个没有任何值的指标。

  • 在任务分发中是否需要传递队列?
  • 我是否需要运行守护进程或类似的东西来实际处理队列中的内容?

我使用artisan make:job命令创建了这个任务。

1个回答

5
你已经非常接近了。
class SaveMetric implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    protected $metric;

    /**
     * Create a new job instance.
     *
     * @param Metrics $metric
     */
    public function __construct(Metrics $metric)
    {
        $this->metric = $metric;
    }

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
        $this->metric->save();
    }
}

根据文档
在这个例子中,我们可以直接将 Eloquent 模型传递给队列任务的构造函数。由于该任务正在使用 SerializesModels trait,当任务处理时,Eloquent 模型将被优雅地序列化和反序列化。如果您的队列任务在其构造函数中接受 Eloquent 模型,则仅会将模型的标识符序列化到队列上。当实际处理作业时,队列系统将自动从数据库重新检索完整的模型实例。

1
这个操作加上移除SerializesModels trait让我得到了预期的行为。 - CMOS
谢谢!是的,我也必须删除SerializesModels特质,因为我希望我的作业能够保存任何继承了我BaseModel的类。 - Ryan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接