4

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

然后在我的控制器功能中,在我获取所有我需要的值之后运行它

dispatch(new SaveMetric($newMetric));

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

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

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

4

1 回答 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 特征,Eloquent 模型将在作业处理时优雅地序列化和反序列化。如果您的队列作业在其构造函数中接受 Eloquent 模型,则只有模型的标识符将被序列化到队列中。当实际处理作业时,队列系统会自动从数据库中重新检索完整的模型实例。

于 2017-03-23T16:22:25.150 回答