一分一毛也是爱

微信

微信

支付宝

支付宝

观海听潮

观海听潮博客

登录
还没有账号?去注册
观海听潮

观海听潮博客

注册
×

我的名片

网名:观海听潮

职业:PHP开发工程师

现居:山东省-青岛市

Email:[email protected]

网站统计

  • 观海听潮•博客
  • 77篇
  • 149条
  • 110370次
  • 263次
  • 美国弗吉尼亚州

您现在的位置是:首页  > 技术杂谈  > Laravel  > php php

观海听潮

laravel 异步队列详解

观海听潮 343天前 1226 0条评论
摘要
laravel异步队列:可以大幅度缩短 Web 请求和响应的时间,优化用户体验

异步队列:可以大幅度缩短 Web 请求和响应的时间。

注意:本地安装配置redis扩展,且已经启动redis

1、创建队列任务:

    php artisan make:job CloseOrder

2、CloseOrder.php:

    <?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 App\Services\Facades\Api\Order\OrderService;

            class CloseOrder implements ShouldQueue

            {

                use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

                protected $order;//订单信息

                public function __construct($order, $delay)

                {

                    $this->order = $order;

                    // 设置延迟的时间,delay() 方法的参数代表多少秒之后执行

                    $this->delay($delay);

                }

                // 当队列处理器从队列中取出任务时,会调用 handle() 方法

                public function handle()

                {

                    // 判断对应的订单是否已经被支付

                    // 如果已经支付则不需要关闭订单,直接退出

                    if ($this->order['order_status']!=1) {

                        return;

                    }

             //处理业务逻辑,更改订单状态,更新商品库存等

            

             //处理失败异常抛出

                    throw new \Exception('取消订单失败:单号:'.$this->order['order_no']);

                }

            }

3、队列调用:

    use App\Jobs\CloseOrder;

    dispatch(new CloseOrder($orderData, 30 * 60));//30分钟后自动取消订单

4、更改异步驱动:

    在laravel生成的.env文件中将队列驱动由同步sync改为redis

    QUEUE_CONNECTION=redis

5、安装predis/predis包

    使用redis异步驱动,需要安装predis/predis包

    composer require predis/predis

6、启动队列

    php artisan queue:work



调用方法:

    dispatch_now(new CloseOrder($orderData));//立即异步执行方法

    dispatch(new CloseOrder($orderData, 30 * 60));//延迟30分钟后执行方法

失败任务处理:

    将失败的任务记录到数据库,命令如下:

    php artisan queue:failed-table

    php artisan migrate

设置最大尝试次数:

    php artisan queue:work redis --tries=3

    任务失败后,将最大执行3次,3次后失败任务记录到数据库中、

重新尝试失败任务:

    查看失败任务:

    php artisan queue:failed

    执行命令后将会列出任务 ID ,队列,以及失败的时间。

    尝试单个任务:php artisan queue:retry 任务ID

    尝试所有失败任务:php artisan queue:retry all

删除失败任务:

    删除单个失败任务:php artisan queue:forget 任务ID

    删除所有失败任务:php artisan queue:flush

监听任务队列:

    php artisan queue:listen

启动队列守护进程:

    安装Supervisor

    相关文档:https://learnku.com/docs/laravel/5.8/queues/3923#job-events


讨厌 (0)
微博logo QQ空间logo QQlogo 豆瓣logo 人人logo 百度贴吧logo 有道云笔记logo

文章评论

表情表情
×
图片图片

评论列表