Laravel 5.4通过异步队列保存模型

CMO*_*MOS 3 laravel laravel-5 laravel-queue

因此,我正在尝试优化网站,并在每次加载和退出页面时都保存一个指标(页面停留时间,IP地址等)进行分析。但是,这些是我服务器上相当大的瓶颈。当查看运行我的整个功能所需的时间时,整个函数大约需要1-2ms,然后保存到数据库大约需要100-200ms。因此,我的目标是运行我的函数,然后调度新任务,这将完成指标的实际保存。这样,所有保存的模型都可以卸载到队列中。以下是我的工作副本

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在获取所有需要的值后在控制器功能中运行此命令

dispatch(new SaveMetric($newMetric));
Run Code Online (Sandbox Code Playgroud)

这似乎可以运行,但似乎无能为力。我想念什么吗?(编辑)这样做〜某事〜它只是将一条记录保存到DB中所有字段中都为null,就像我创建了一个没有任何值的新指标一样。

  • 是否需要将队列传递到作业分派中?
  • 我是否需要运行守护程序或类似的东西来实际处理队列中的内容?

我使用工匠make:job命令创建了作业

小智 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

根据文档

在此示例中,请注意,我们能够将Eloquent模型直接传递到排队作业的构造函数中。由于作业正在使用SerializesModels特性,因此在处理作业时,雄辩的模型将正常进行序列化和反序列化。如果您排队的作业在其构造函数中接受Eloquent模型,则仅该模型的标识符将被序列化到队列中。实际处理完作业后,队列系统将自动从数据库中重新检索完整的模型实例。