10.工作延迟处理

工作延迟处理是提高网站体验的一个重要技巧,对一些不要立即去的响应且需要花时间处理的工作,全部放到后台处理,并立即响应用户的数据请求。

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('[email protected]');

            $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 带来的内存泄漏。

你可能感兴趣的:(10.工作延迟处理)