从产品基础使用文档,开发指导,操作指南,常见问题等方面阐述,助你快速部署建站系统。
配置文件queue.php
‘redis’, ‘connections’ => [ ‘sync’ => [ ‘type’ => ‘sync’, ], ‘database’ => [ ‘type’ => ‘database’, ‘queue’ => ‘default’, ‘table’ => ‘jobs’, ], ‘redis’ => [ ‘type’ => ‘redis’, ‘queue’ => ‘default’, ‘host’ => Env::get(‘redis.redis_hostname’, ‘127.0.0.1’), ‘port’ => Env::get(‘redis.port’, 6379), ‘password’ => Env::get(‘redis.redis_password’, ‘’), ‘select’ => Env::get(‘redis.select’, 0), ‘timeout’ => 0, ‘persistent’ => false, ], ], ‘failed’ => [ ‘type’ => ‘none’, ‘table’ => ‘failed_jobs’, ], ];
测试队列文件PublicController.php
uniqid(), 'time' => time(), \]; //将该任务推送到消息队列,等待对应的消费者去执行 //这里只是负责将数据添加到相应的队列名称的队列里,消费者与生产者并无联系 $isPushed = Queue::push($jobHandlerClassName , $orderData, $jobQueueName); if( $isPushed !== false )\{ echo date('Y-m-d H:i:s') . " 队列添加成功"; \}else\{ echo '队列添加失败'; \} \} }
队列执行文件DemoJob.php
checkDatabaseToSeeIfJobNeedToBeDone($data); if(!$isJobStillNeedToBeDone){ $job->delete(); return; } $isJobDone = $this->orders($data); if ($isJobDone) \{ //如果任务执行成功,记得删除任务 $job->delete(); \}else\{ //通过这个方法可以检查这个任务已经重试了几次了 if ($job->attempts() > 3)\{ $job->delete(); //也可以重新发布这个任务 //print("Hello Job will be availabe again after 2s."."\\n"); //$job->release(2); //$delay为延迟时间,表示该任务延迟2秒后再执行 \} \} \} /\*\* \* @Title: checkDatabaseToSeeIfJobNeedToBeDone \* @Description: todo(有些消息在到达消费者时,可能已经不再需要执行了) \* @param array $data \* @throws \*/ private function checkDatabaseToSeeIfJobNeedToBeDone($data)\{ return true; \} /\*\* \* @Title: orders \* @Description: todo(数据处理) \* @throws \*/ public function orders($data) \{ //对订单进行数据库操作或其他等等 for($i=0;$iinsert($arr); \} print("Job has been done and deleted"."\\n"); return true; \} }
开启队列进程
php think queue:work —queue orderJobQueue
或者(linux)
php think queue:work —queue orderJobQueue —daemon
注意:php think queue:work —queue 将执行默认队列