队列驱动支持
config/queue.php
每一个队列驱动都基于底层链接,且经过属性queue
指定默认队php
Redis、Beanstalkd、Database(需:php artisan queue:table && php artisan migrate)、Sqs、IronMQ
等sysnc同步驱动(当即执行Job)
、null驱动(简单丢弃Job)
RabbitMQ、Kafka
等Fail表准备html
php artisan queue:failed-table php artisan migrate
php artisan make:job MyJob
(默认实现接口ShouldQueue
以队列化的异步执行)model实例
,则仅有ID
会被序列化并存入队列,消费时经过ID
于数据库从新取回$myJob = new MyJob(); dispatch($myJob);
handle
方法:Job
消费逻辑failed(Exception $exception)
方法:Job
失败后的收尾逻辑Job
建议投递到同一队列上(好比短信Job
和邮件Job
都投递到notification
队列上)$myJob->delay(Carbon::now()->addMinutes(10))
$myJob->onQueue(指定队)
$myJob->onConnection(指定链接)
public $tries = 3;
(Job执行中发生Excepion则被退回队列并重试)public $timeout = 60;
(秒)##Queue执行数据库
--queue
参数前后顺序可指定优先级# 启动队列执行器 * 生产环境(高效模式):php artisan queue:work --daemon [--quiet ] [--delay=3] [--sleep=队列空后的休眠时间] [--tries=3] [--timeout=30] [--memory=默认128M] [--queue=队列1,队列2] [指定链接] * 测试环境(每次重载上下文):php artisan queue:listen [--tries=3] [--timeout=30] [--sleep=队列空后的休眠时间] [--queue=队列1,队列2] [指定链接] # 重启队列执行器(以便在项目部署时重载代码上下文) php artisan queue:restart
retry_after
属性)指定了Job
重试的等待时间--timeout
)指定了处理Job
的子队列执行器被kill
前的超时时间Job
会先超时被kill
,而后在到达过时时间后被重试失败流程bash
Job
失败,执行failed(Exception $exception)
方法中失败后的收尾逻辑Job
在最终尝试后还失败,则入表failed_jobs
FailedJob处理异步
php artisan queue:failed
php artisan queue:retry all|jobID
php artisan queue:forget all|jobID
php artisan queue:flush
# AppServiceProvider::boot 中注册Job事件的监听 //$event->connectionName //$event->job->payload() //$event->exception Queue::before(function(JobProcessing $event){}); Queue::after(function(JobProcessed $event){}); Queue::failing(function(JobFailed $event){}); # queue worker请求Job前 Queue::looping(function(){ # 可处理一些回滚 while (DB::transactionLevel() > 0) { DB::rollBack(); } });
经过supervisor
启动队列消费服务ide
进程守护
队列消费服务多进程
方式消费队列中的Job
配置函数
# /etc/supervisor/conf.d/queue-worker-test.conf [program:queue-worker-test] process_name=%(program_name)s_%(process_num)02d directory=/var/www/html command=php artisan queue:work --daemon --quiet --delay=3 --sleep=3 --tries=3 --memory=1024 --queue=test autostart=true autorestart=true user=www numprocs=5 #当>1时, process_name必须有%(process_num) priority=997 stopsignal=QUIT redirect_stderr=true stdout_logfile=/dev/null stdout_logfile_maxbytes=0 stdout_logfile_backups=0 stderr_logfile=/dev/null stderr_logfile_maxbytes=0 stderr_logfile_backups=0
启动oop
sudo supervisorctl reread sudo supervisorctl update sudo supervisorctl start queue-worker-test:*