我正在尝试优化我的网站,并在每次页面加载和退出时保存统计数据(停留时间、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命令创建了这个任务。
SerializesModels
特质,因为我希望我的作业能够保存任何继承了我BaseModel
的类。 - Ryan