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

Laravel 5.4 saving models via async queue

所以我正在尝试优化我的网站,在每次加载和退出页面时,我都会保存一个指标(页面停留时间、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));

这似乎 运行 但似乎没有任何作用。我错过了什么吗? (编辑)这做了一些事情~它只是将记录保存到数据库中,所有字段都为空,就好像我创建了一个没有任何值的新指标。

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

你很接近。

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();
    }
}

根据the docs

In this example, note that we were able to pass an Eloquent model directly into the queued job's constructor. Because of the SerializesModels trait that the job is using, Eloquent models will be gracefully serialized and unserialized when the job is processing. If your queued job accepts an Eloquent model in its constructor, only the identifier for the model will be serialized onto the queue. When the job is actually handled, the queue system will automatically re-retrieve the full model instance from the database.