您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# Laravel队列怎么使用
## 目录
1. [队列概述](#队列概述)
2. [配置队列](#配置队列)
3. [创建队列任务](#创建队列任务)
4. [分发任务](#分发任务)
5. [运行队列处理器](#运行队列处理器)
6. [队列监控](#队列监控)
7. [失败任务处理](#失败任务处理)
8. [高级队列用法](#高级队列用法)
9. [最佳实践](#最佳实践)
---
## 队列概述
Laravel队列系统允许你将耗时的任务(如发送邮件、处理文件等)延迟处理,从而显著提升Web应用的响应速度。队列的核心机制是将任务放入队列服务(如数据库、Redis等),然后由后台工作进程异步执行。
### 为什么需要队列?
- **提升用户体验**:避免用户等待耗时操作完成
- **解耦应用逻辑**:将非核心流程异步化
- **提高系统稳定性**:失败任务可重试
- **负载均衡**:平滑处理流量高峰
---
## 配置队列
Laravel支持多种队列驱动,配置文件位于`config/queue.php`。
### 常用队列驱动
```php
'connections' => [
'sync' => [
'driver' => 'sync', // 同步执行(用于开发)
],
'database' => [
'driver' => 'database',
'table' => 'jobs',
'queue' => 'default',
'retry_after' => 90,
],
'redis' => [
'driver' => 'redis',
'connection' => 'default',
'queue' => '{default}',
'retry_after' => 90,
'block_for' => null,
],
]
QUEUE_CONNECTION=database
php artisan queue:table
php artisan migrate
队列任务通常称为”Job”,使用Artisan命令创建:
php artisan make:job ProcessPodcast
生成的Job类位于app/Jobs
目录:
<?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 ProcessPodcast implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
public function __construct()
{
// 初始化参数
}
public function handle()
{
// 任务处理逻辑
}
}
ShouldQueue
接口标记为可队列化任务SerializesModels
自动优雅地序列化Eloquent模型handle()
方法是任务执行入口ProcessPodcast::dispatch();
ProcessPodcast::dispatch()
->delay(now()->addMinutes(10));
ProcessPodcast::dispatch()
->onQueue('processing');
ProcessPodcast::withChain([
new OptimizePodcast,
new ReleasePodcast
])->dispatch();
php artisan queue:work
# 指定队列连接
php artisan queue:work redis
# 处理特定队列
php artisan queue:work --queue=high,default
# 限制最大尝试次数
php artisan queue:work --tries=3
# 守护进程模式(生产环境推荐)
php artisan queue:work --daemon
/etc/supervisor/conf.d/laravel-worker.conf
:
[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/artisan queue:work --sleep=3 --tries=3
autostart=true
autorestart=true
user=www-data
numprocs=8
redirect_stderr=true
stdout_logfile=/var/log/laravel-worker.log
php artisan queue:failed-table
php artisan migrate
php artisan queue:failed
# 重试所有
php artisan queue:retry all
# 重试特定ID
php artisan queue:retry 1
composer require laravel/horizon
在Job类中添加failed
方法:
public function failed(Exception $exception)
{
// 发送失败通知等
}
'failed' => [
'driver' => 'database',
'database' => env('DB_CONNECTION', 'mysql'),
'table' => 'failed_jobs',
],
$batch = Bus::batch([
new ProcessPodcast,
new ProcessPodcast,
new ProcessPodcast,
])->then(function (Batch $batch) {
// 所有任务成功完成
})->catch(function (Batch $batch, Throwable $e) {
// 首个失败任务
})->finally(function (Batch $batch) {
// 批次执行完成
})->dispatch();
Redis::throttle('key')->allow(10)->every(60)->then(
function () {
ProcessPodcast::dispatch();
},
function () {
// 无法获得锁...
}
);
retry_after
应大于任务最长执行时间queue:work
进程数--sleep
时间(通常3-5秒)通过合理使用Laravel队列系统,你可以显著提升应用程序的性能和用户体验。根据业务需求选择合适的驱动和配置方案,并建立完善的监控机制,确保队列任务可靠执行。 “`
注:本文约3500字,涵盖了Laravel队列的核心知识点。实际使用时可根据项目需求调整配置参数和实现细节。生产环境务必配置进程监控(如Supervisor)和失败任务处理机制。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。