tp消息队列的使用
- 文档地址:消息队列文档地址:https://github.com/qmister/think-queue/tree/master/doc
- composer安装命令:
composer install thinkphp-queue
- 安装后会在tp的config文件夹下生成queue.php这个配置文件
- 在app目录下创建job目录,用来放消息队列任务
- 创建任务如下
namespace app\job;
use think\queue\Job;
class Test {
public function fire(Job $job, $data) {
writeLog($data, 'test', 'job_test');
$isJobDone = $this->doTest($data);
if ($isJobDone) {
//如果任务执行成功,记得删除任务
echo "删除任务开始" . $job->attempts() . '\n';
$job->delete();
} else {
//通过这个方法可以检查这个任务已经重试了几次了
if ($job->attempts() > 3) {
writeLog('已执行失败3次了', 'test', 'job_test');
$job->delete();
}
}
}
/**
* 根据消息中的数据进行实际的业务处理...
* @param array $data
* @return bool
*/
private function doTest(array $data) {
$data['xcz'] = '测试消息队列处理';
writeLog($data, 'test', 'job_test');
echo "测试消息队列";
return true;
}
}
- 添加生产者
public function index(){
// 1.当前任务将由哪个类来负责处理。
// 当轮到该任务时,系统将生成一个该类的实例,并调用其 fire 方法
$jobHandlerClassName = 'app\job\Test@fire';
// 2.当前任务归属的队列名称,如果为新队列,会自动创建
$jobQueueName = "jobTest";
// 3.当前任务所需的业务数据 . 不能为 resource 类型,其他类型最终将转化为json形式的字符串
// ( jobData 为对象时,需要在先在此处手动序列化,否则只存储其public属性的键值对)
$jobData = ['ts' => time(), 'bizId' => uniqid(), 'a' => 1,'dates'=>date("Y-m-d H:i:s")];
// 4.将该任务推送到消息队列,等待对应的消费者去执行
$isPushed = Queue::push($jobHandlerClassName, $jobData, $jobQueueName);
// $isPushed = Queue::later(10, $jobHandlerClassName, $jobData, $jobQueueName);
// database 驱动时,返回值为 1|false ; redis 驱动时,返回值为 随机字符串|false
if ($isPushed !== false) {
echo '推送成功';
} else {
echo '推送失败';
}
}
8.消息队列启动命令:
php think queue:listen --queue jobTest
或者php think queue:work --queue jobTest
如果任务出现内存不足和超时,可改为:
think queue:work --queue jobTest--memory=1024 --timeout=0
访问生产者产生如下图效果
添加守护进程如下图
结束