1. 需求
发生一个请求到一个服务器时,这个服务器需要请求别的服务器数据,而这个请求是写在同步任务的方法里,只有等这个任务执行完成才能执行后面的代码;通常这种情况会影响网站的请求速度,因此可以使用redis队列去解决这个问题,也可以使用rabbitmq
2. 实现步骤
- 配置redis连接
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379 - 配置队列驱动(默认是同步)
QUEUE_CONNECTION=redis - 创建队列任务
php artisan make:job ProcessOrder - 编辑任务逻辑
<?php namespace App\Jobs; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Queue\SerializesModels; class ProcessOrder implements ShouldQueue { use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; protected $orderId; public function __construct($orderId) { $this->orderId = $orderId; } public function handle() { // 处理订单逻辑 $order = \App\Models\Order::find($this->orderId); if ($order) { $order->status = 'processing'; $order->save(); // 模拟耗时操作 sleep(5); $order->status = 'completed'; $order->save(); } } }
- 将任务加入队列中
<?php namespace App\Http\Controllers; use App\Jobs\ProcessOrder; use Illuminate\Http\Request; class OrderController extends Controller { public function store(Request $request) { // 创建订单 $order = \App\Models\Order::create([ 'user_id' => auth()->id(), 'amount' => $request->amount, 'status' => 'pending' ]); // 将任务推送到队列 ProcessOrder::dispatch($order->id) ->onQueue('orders') ->delay(now()->addMinutes(1)); return response()->json(['message' => 'Order created and queued for processing']); } }
- 启动队列监听器
php artisan queue:work --queue=orders