目录
一、失败队列
(1)配置
# config/queue.php
'failed' => [
'database' => env('DB_CONNECTION', 'mysql'),
'table' => 'failed_jobs',
],
(2)建表
php artisan queue:failed-table # 创建迁移文件,默认创建 failed_jobs 表
php artisan migrate
二、队列配置
1、同步用法 sync
(1)同步调用方法一
- 配置 sync
# .env
QUEUE_DRIVER=sync
# conf/queue.php
'connections' => [
'sync' => [
'driver' => 'sync',
],
...
],
- 调用
MyJob::dispatch($book);
(2)同步调用方法二
$book = Book::first()->toArray();
//同步调用
$job = new MyJob($book);
$job->handle();
2、数据库驱动 database
- 配置
# .env
QUEUE_DRIVER=database
# conf/queue.php
'connections' => [
'database' => [ # 队列连接,来自 config/database.php
'driver' => 'database',
'table' => 'jobs', # 表名
'queue' => 'default', # 队列名
'retry_after' => 90, # 重新进队时间 > 超时时间timeout
],
],
- 建表
默认创建名为 jobs 的数据表,用来存储任务。
php artisan queue:table # 创建迁移文件,默认 jobs 表
php artisan migrate
- 监听
tries 重试次数,不设置代表失败无限重试;
timeout 超时时间,超时会停止任务执行;
retry_after 超时重试时间,超时会重新进队,应结合 timeout,避免任务未结束而重复进队。
php artisan queue:work [队列连接] [队列] [重试次数] [超时关闭时间] [重试重试时间]
php artisan queue:work database --queue=default --tries=3 --timeout=80 --retry_after=90
php artisan queue:work --tries=3 --timeout=80 --retry_after=90
php artisan queue:work --tries=3 --timeout=80
php artisan queue:work --tries=3
php artisan queue:work
- 调用
同一个数据库,同一个表 jobs,不同的队列:default、default1。如果不指定队列,则使用默认的队列 default,不需要另外的配置。
$book = Book::first()->toArray();
MyJob::dispatch($book)->delay(2);
MyJob::dispatch($book)->delay(2)->onConnection('database')->onQueue('default');
MyJob::dispatch($book)->delay(2)->onQueue('default'); // php artisan queue:work database --queue=default --tries=3
MyJob::dispatch($book)->delay(2)->onQueue('default1'); // php artisan queue:work database --queue=default1 --tries=3
MyJob::dispatch($book)->delay(Carbon::now()->addSeconds(10));
3、缓存驱动 redis
- 配置(多个)
# .env
QUEUE_DRIVER=redis
# conf/queue.php
'connections' => [
'redis' => [ # 队列连接(默认)
'driver' => 'redis',
'connection' => 'default', # 缓存配置连接,来自 config/database.php
'queue' => 'default', # 队列
'retry_after' => 90,
],
'redis1' => [ # 队列连接
'driver' => 'redis',
'connection' => 'default1', # 缓存配置连接,来自 config/database.php
'queue' => 'default1', # 队列
'retry_after' => 90,
],
],
- 监听(多个)
php artisan queue:work redis --queue=default --tries=3
php artisan queue:work redis1 --queue=default1 --tries=3
- 调用
$book = Book::first()->toArray();
MyJob::dispatch($book); // php artisan queue:work redis --queue=default --tries=3
MyJob::dispatch($book)->delay(2); // php artisan queue:work redis --queue=default --tries=3
MyJob::dispatch($book)->delay(2)->onConnection('redis'); // php artisan queue:work redis --queue=default --tries=3
MyJob::dispatch($book)->delay(2)->onQueue('default'); // php artisan queue:work redis --queue=default --tries=3
MyJob::dispatch($book)->delay(2)->onConnection('redis')->onQueue('default'); // php artisan queue:work redis --queue=default --tries=3
MyJob::dispatch($book)->delay(2)->onConnection('redis1'); // php artisan queue:work redis1 --queue=default1 --tries=3
MyJob::dispatch($book)->delay(2)->onConnection('redis1')->onQueue('default1'); // php artisan queue:work redis1 --queue=default1 --tries=3
- 队列
查看队列,当队列有任务时,会创建队列 queues:xxx 键,当队列任务清空时,会删除队列 queues:xxxx 键。
> redis-cli -h localhost -p 3306 -a 123
> keys queues*
"queues:default"
"queues:default:delayed"
"queues:default1:delayed"
> type queues:default:delayed
zset
> zcard queues:default:delayed
(integer) 2
> zrange queues:default:delayed 0 1
1) "{\"displayName\":\"App\\\\Jobs\\\\MyJob\",\"job\":\"Illuminate\\\\Queue\\\\CallQueuedHandler@call\",\"maxTries\":null,\"timeout\":null,\"data\":{\"commandName\":\"App\\\\Jobs\\\\MyJob\",\"command\":\"O:14:\\\"App\\\\Jobs\\\\MyJob\\\":5:{s:3:\\\"msg\\\";a:6:{s:2:\\\"id\\\";i:1;s:4:\\\"name\\\";N;s:6:\\\"author\\\";s:9:\\\"author111\\\";s:12:\\\"publish_year\\\";s:4:\\\"2020\\\";s:10:\\\"created_at\\\";s:19:\\\"2020-10-04 20:48:31\\\";s:6:\\\"status\\\";i:0;}s:6:\\\"\\u0000*\\u0000job\\\";N;s:10:\\\"connection\\\";s:5:\\\"redis\\\";s:5:\\\"queue\\\";N;s:5:\\\"delay\\\";i:2;}\"},\"id\":\"T2L2hzBg1GhkYZDp0tErLYvjHva3QMph\",\"attempts\":0}"
2) "{\"displayName\":\"App\\\\Jobs\\\\MyJob\",\"job\":\"Illuminate\\\\Queue\\\\CallQueuedHandler@call\",\"maxTries\":null,\"timeout\":null,\"data\":{\"commandName\":\"App\\\\Jobs\\\\MyJob\",\"command\":\"O:14:\\\"App\\\\Jobs\\\\MyJob\\\":5:{s:3:\\\"msg\\\";a:6:{s:2:\\\"id\\\";i:1;s:4:\\\"name\\\";N;s:6:\\\"author\\\";s:9:\\\"author111\\\";s:12:\\\"publish_year\\\";s:4:\\\"2020\\\";s:10:\\\"created_at\\\";s:19:\\\"2020-10-04 20:48:31\\\";s:6:\\\"status\\\";i:0;}s:6:\\\"\\u0000*\\u0000job\\\";N;s:10:\\\"connection\\\";s:5:\\\"redis\\\";s:5:\\\"queue\\\";N;s:5:\\\"delay\\\";i:2;}\"},\"id\":\"1tVD4tizRjs1lJPaVrXOVAo1BP8UTjQ9\",\"attempts\":0}"
三、队列日志
1、任务执行日志
--tries=3,重试三次的队列日志
(1)成功
Processing: App\Jobs\MyJob
Processing: App\Jobs\MyJob
Processing: App\Jobs\MyJob
Processed: App\Jobs\MyJob
(2)失败
Processing: App\Jobs\MyJob
Processing: App\Jobs\MyJob
Processing: App\Jobs\MyJob
Failed: App\Jobs\MyJob
2、日志输出
(1)handle 方法使用 Log 方法,会打印到 laravel 日志;
(2)handle 方法使用 dump 方法,会打印到 控制台 或者 队列日志(supervisor 配置);
四、supervisor 管理队列
[program:laravel_queue_default]
process_name=%(program_name)s_%(process_num)02d
command=php /usr/local/nginx/html/laravel_0920/artisan queue:work redis --queue=default --tries=2 --timeout=15
autorestart=true
autostart=true
redirect_stderr = true
stdout_logfile=/usr/local/nginx/logs/laravel_queue_default.log
user=nginx
numprocs=2
五、默认队列配置文件
<?php
return [
/*
|--------------------------------------------------------------------------
| Default Queue Driver
|--------------------------------------------------------------------------
|
| Laravel's queue API supports an assortment of back-ends via a single
| API, giving you convenient access to each back-end using the same
| syntax for each one. Here you may set the default queue driver.
|
| Supported: "sync", "database", "beanstalkd", "sqs", "redis", "null"
|
*/
'default' => env('QUEUE_DRIVER', 'sync'),
/*
|--------------------------------------------------------------------------
| Queue Connections
|--------------------------------------------------------------------------
|
| Here you may configure the connection information for each server that
| is used by your application. A default configuration has been added
| for each back-end shipped with Laravel. You are free to add more.
|
*/
'connections' => [
'sync' => [
'driver' => 'sync',
],
'database' => [
'driver' => 'database',
'table' => 'jobs',
'queue' => 'default',
'retry_after' => 90,
],
'beanstalkd' => [
'driver' => 'beanstalkd',
'host' => 'localhost',
'queue' => 'default',
'retry_after' => 90,
],
'sqs' => [
'driver' => 'sqs',
'key' => 'your-public-key',
'secret' => 'your-secret-key',
'prefix' => 'https://sqs.us-east-1.amazonaws.com/your-account-id',
'queue' => 'your-queue-name',
'region' => 'us-east-1',
],
'redis' => [
'driver' => 'redis',
'connection' => 'default',
'queue' => 'default',
'retry_after' => 90,
],
],
/*
|--------------------------------------------------------------------------
| Failed Queue Jobs
|--------------------------------------------------------------------------
|
| These options configure the behavior of failed queue job logging so you
| can control which database and table are used to store the jobs that
| have failed. You may change them to any database / table you wish.
|
*/
'failed' => [
'database' => env('DB_CONNECTION', 'mysql'),
'table' => 'failed_jobs',
],
];