问题描述
我有一个 API 函数,可以将 pdf 文件存储到我的 s3 bucket
,然后将 pdf 文件作为附件发送电子邮件。
由于这是我第一次,我很困惑,因为根据我的理解,作业是从后台执行的,因此应该不会影响函数的执行时间。
但是,拥有这些作业会使执行时间几乎8 seconds
。
这是我的功能
$is_exist = CoachingApplication::where('user_id',$userID)->first();
if ($is_exist == null) {
$application = new CoachingApplication();
$application->user_id = $userID;
$application->applicant_name = $applicantName;
$application->attachment = $filename;
$application->instrument_rate = $instrumentRate;
if ($application->save()) {
if ($filename !== 'none') {
StoreBucketJob::dispatch($userID,$filename,$attachment_fileArray)->delay(Carbon::Now()->addSeconds(3));
}
SendEmailJob::dispatch($userID,$userName,$userSlug,$userEmail,$filename)->delay(Carbon::Now()->addSeconds(3));
}
}
知道为什么这些作业会影响 api 的执行时间吗?
解决方法
默认情况下,队列驱动程序设置为 sync
,您可能正在使用它。
这个队列驱动意味着你的作业将在当前进程中执行,不会在实际队列中分派(这在开发过程中非常有用)。
100% 确保您的作业确实是同步执行的一个好方法是将 dd("ok");
放在您的作业中 handle
方法的第一行。 handle
仅在作业运行时执行,而不是在分派时执行。
可以通过编辑您的 .env
文件(查找 QUEUE_CONNECTION
)来更新队列驱动程序。
有许多可用的队列驱动程序,其中一些需要额外的依赖项,因此您应该查看可用的文档 https://laravel.com/docs/8.x/queues。