工作延迟处理是提高网站体验的一个重要技巧,对一些不要立即去的响应且需要花时间处理的工作,全部放到后台处理,并立即响应用户的数据请求。
1.php artisan queue:table 生成队列表(QUEUE_DRIVER 为数据库时使用)
2.php artisan make:job SendSignUpMailJob (创建job文件),位置位于app/Jobs,其中handle()方法会由队列秘书完成。
// 檔案位置:app/Jobs/SendSignUpMailJob.php
namespace App\Jobs;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Mail;
class SendSignUpMailJob implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
protected $mail_binding;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct($mail_binding)
{
$this->mail_binding = $mail_binding;
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
$mail_binding = $this->mail_binding;
Mail::send(
'email.signUpEmailNotification',
$mail_binding,
function($mail) use ($mail_binding)
{
$mail->to($mail_binding['email']);
$mail->from('kejyun@gmail.com');
$mail->subject('恭喜註冊 Shop Laravel 成功');
});
}
}
文件位置app/Http/Controllers/UserAuthController.php
use App\Jobs\SendSignUpMailJob;
// 處理註冊資料
public function signUpProcess(){
//业务逻辑.....
// 寄送註冊通知信
$mail_binding = [
'nickname' => $input['nickname'],
'email' => $input['email'],
];
SendSignUpMailJob::dispatch($mail_binding)
->onQueue('high');
// 重新導向到登入頁
return redirect('/user/auth/sign-in');
}
3.执行队列。
php artisan queue:listen
php artisan queue:work
4.重启队列
php artisan queue:restart
5.queue:listen 和 queue:work 区别
queue:work将自动开启后台进程不再需要使用—daemon进行标记,这种方式运行,框架只会启动一次,并保持循环去消费队列,除非出现异常否则该进程将无限时间运行下去。这种方式消耗的 cpu 和 内存 都比 queue:listen 要少,因为在整个生命周期中框架一直是在保持运行状态。同时,使用该方法时如果更新了代码,记得使用 queue:restart 来重启。
queue:work --once - 该方法会启动框架,运行 job,然后销毁掉。在开发和测试代码的时候使用比较合适,因为每次都会加载一遍代码。
queue:listen - 这种方式运行,框架每次都会启动,运行job,然后关闭,然后再次启动框架,运行job,然后关闭,这样一直循环(每次运行完一次都会完全释放掉运行时的内存和进程)。所以这种方式你不用担心代码的热更新,不用去重启 queue,随之而来的另外一个好处是不用去担心 queue:work 带来的内存泄漏。