搜索中心
搜索中心 搜索快照

开发必看 - 队列调度

队列的目的是将耗时的任务延时处理,比如发送邮件、文档转换处理等,从而大幅度缩短 Web 请求和响应的时间。

队列配置文件存放在 config/queue.php。每一种队列驱动的配置都可以在该文件中找到,包括数据库、Beanstalkd、Amazon SQS、Redis以及同步(本地使用)驱动。

如何使用 MySQL 作为队列驱动

① 生成数据库队列表迁移文件

在执行该步骤前,请先检查迁移文件 database/migrations/xxxx_xx_xx_xxxxxx_create_jobs_table.php 是否存在,如果已存在直接跳过第①步

# 运行该命令之前请检查是否存在迁移文件 database/migrations/xxxx_xx_xx_xxxxxx_create_jobs_table.php
# 如果存在直接跳过该步骤
php artisan queue:table
# 运行该命令之前请检查是否存在迁移文件 database/migrations/xxxx_xx_xx_xxxxxx_create_failed_jobs_table.php
# 如果存在直接跳过该步骤
php artisan queue:failed-table

这一步会生成数据库迁移文件 database/migrations/xxxx_xx_xx_xxxxxx_create_jobs_table.phpdatabase/migrations/xxxx_xx_xx_xxxxxx_create_failed_jobs_table.php

② 执行数据库迁移文件

php artisan migrate

③ 在 .env 文件配置队列驱动为数据库

QUEUE_DRIVER=database
QUEUE_CONNECTION=database

④ 运行队列进程测试运行

如果队列中有任务,以下命令会自动执行一个任务,查看是否报错,无报错表示配置成功

Laravel5

/xxx/bin/php /www/example.com/artisan queue:work database --queue=default --sleep=3 --tries=1 --timeout=86400
  • /xxx/bin/php 替换成 PHP 的运行路径,通常为 /usr/bin/php
  • default 为队列名称,默认为 default,还有其他队列如文档转换 FileConvert

Laravel9

/xxx/bin/php /www/example.com/artisan --queue=default queue:work database --once --sleep=3 --tries=1 --timeout=86400
  • /xxx/bin/php 替换成 PHP 的运行路径,通常为 /usr/bin/php
  • default 为队列名称,默认为 default,还有其他队列如文档转换 FileConvert

如何使用 Redis 作为队列驱动

① 修改 .env 文件,配置 Redis 连接信息

REDIS_HOST=x.x.x.x
REDIS_PASSWORD=yourpassword
REDIS_PORT=6379

② 在 .env 文件配置队列驱动为 Redis

QUEUE_DRIVER=redis
QUEUE_CONNECTION=redis

③ 运行队列进程测试运行

如果队列中有任务,以下命令会自动执行一个任务,查看是否报错,无报错表示配置成功

Laravel5

/xxx/bin/php /www/example.com/artisan queue:work redis --queue=default --sleep=3 --tries=1 --timeout=86400
  • /xxx/bin/php 替换成 PHP 的运行路径,通常为 /usr/bin/php
  • default 为队列名称,默认为 default,还有其他队列如文档转换 FileConvert

Laravel9

/xxx/bin/php /www/example.com/artisan --queue=default queue:work redis --once --sleep=3 --tries=1 --timeout=86400
  • /xxx/bin/php 替换成 PHP 的运行路径,通常为 /usr/bin/php
  • default 为队列名称,默认为 default,还有其他队列如文档转换 FileConvert

使用 Supervisor 管理队列进程

如果你使用的是 ssh 运行的队列进程,当 ssh 连接断开时,该进程会自动停止。

Supervisor 是 Linux 系统中常用的进程守护程序,如果队列进程 queue:work 意外关闭,它会自动重启启动队列进程。

Supervisor 参考配置

Laravel5

[program:queue-worker]
process_name=%(program_name)s_%(process_num)02d
command=/xxx/bin/php /www/example.com/artisan queue:listen database --sleep=5 --memory=4096 --tries=1 --timeout=86400
autostart=true
autorestart=true
user=www
numprocs=1
redirect_stderr=true
stdout_logfile=/tmp/worker.log
  • /xxx/bin/php 替换成 PHP 的运行路径,通常为 /usr/bin/php
  • default 为队列名称,默认为 default,还有其他队列如文档转换 FileConvert
  • command 表示执行的命令
  • user 表示启动进程的用户
  • numprocs 可以控制队列进程的数量,即同时执行的任务数

Laravel9

[program:queue-worker]
process_name=%(program_name)s_%(process_num)02d
command=/xxx/bin/php /www/example.com/artisan queue:work database --queue=default --sleep=3 --tries=1 --timeout=86400
autostart=true
autorestart=true
user=www
numprocs=1
redirect_stderr=true
stdout_logfile=/tmp/worker.log
  • /xxx/bin/php 替换成 PHP 的运行路径,通常为 /usr/bin/php
  • default 为队列名称,默认为 default,还有其他队列如文档转换 FileConvert
  • command 表示执行的命令
  • user 表示启动进程的用户
  • numprocs 可以控制队列进程的数量,即同时执行的任务数
查看原文
QQ
微信
客服