1 环境
Laravel是一种类似ThinkPHP的php框架,封装的诸多功能可以很方便的使用。队列Queue便是其中之一。
Windows环境下,可使用PHPstorm作为Laravel的集成开发环境IDE。
2 队列
Laravel可配置多种队列驱动,包括 "sync", "database", "beanstalkd", "sqs", "redis", "null"(具体参见app/config/queue.php)
其中sync为同步,database为使用数据库,后面三种为第三方队列服务,最后一种为不使用队列。
通过在 .env 中的 QUEUE_CONNECTION 选项,来决定选择何种驱动。
如 QUEUE_CONNECTION=database 即为选择数据库驱动队列。
3 原理
所谓队列,会有数据的生产者和消费者之分。生产者向队列中投递数据,消费者从队列中获取数据。
比如向用户发送邮件的场景:现在有10w封邮件需要发送,最简单的,我们需要有一个方法将邮件的收件人、内容等,拆分成10w条任务放在队列中,同时需要设置一个回调方法负责处理每条任务。当队列中有邮件发送任务时,队列会主动调用回调方法,并传递任务详情进去。回调方法处理完成后,单条邮件即发送完毕。其他邮件依样处理。
4 使用数据库驱动队列
4.1 生成任务表
在终端下输入
php artisan queue:tablephp artisan migrate
在数据库连接正常的情况下,会在数据库中出现jobs表:
[id] bigint [queue] nvarchar(255) [payload] nvarchar(max) [attempts] tinyint [reserved_at] int [available_at] int [created_at] int
4.2 创建任务类
php artisan make:job SendEmail
在终端内执行上述命令,会自动生成 app/Jobs/SendMail.php 文件
class SendMail implements ShouldQueue
在该文件的handle方法中,可以放置任务处理逻辑。
4.3 发送任务
在任意位置,均可像下面一样调用 dispatch 发送任务
SendMail::dispatch($email);
4.4 驱动队列
完成上述步骤后,可以在数据库中发现一条记录(导出为insert SQL语句):
代码如下:INSERT INTO [jobs]([id], [queue], [payload], [attempts], [reserved_at], [available_at], [created_at]) VALUES (6, N'default', N'{"displayName":"App//Jobs//ProcessPodcast","job":"Illuminate//Queue//CallQueuedHandler@call","maxTries":null,"timeout":null,"timeoutAt":null,"data":{"commandName":"App//Jobs//ProcessPodcast","command":"O:23:/"App//Jobs//ProcessPodcast/":8:{s:29:/"/u0000App//Jobs//ProcessPodcast/u0000data/";s:6:/"111222/";s:6:/"/u0000*/u0000job/";N;s:10:/"connection/";N;s:5:/"queue/";N;s:15:/"chainConnection/";N;s:10:/"chainQueue/";N;s:5:/"delay/";N;s:7:/"chained/";a:0:{}}"}}', 0, NULL, 1545980176, 1545980176);
新闻热点
疑难解答