从产品基础使用文档,开发指导,操作指南,常见问题等方面阐述,助你快速部署建站系统。
配置文件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 将执行默认队列