return [
'connector' => 'Redis', // Redis 驱动
'expire' => null, // 任务的过期时间,默认为60秒; 若要禁用,则设置为 null
'default' => 'default', // 默认的队列名称
'host' => '127.0.0.1', // redis 主机ip
'port' => 6379, // redis 端口
'password' => '', // redis 密码
'select' => 0, // 使用哪一个 db,默认为 db0
'timeout' => 0, // redis连接的超时时间
'persistent' => false, // 是否是长连接
];
extra->queue.php 配置文件中加入上面内容
<?php
namespace app\admin\controller;
use think\Queue;
class Test
{
public function actionWithHelloJob(){
// 1.当前任务将由哪个类来负责处理。
// 当轮到该任务时,系统将生成一个该类的实例,并调用其 fire 方法
$jobHandlerClassName = 'app\admin\controller\Demo';
// 2.当前任务归属的队列名称,如果为新队列,会自动创建
$jobQueueName = "helloJobQueue";
// 3.当前任务所需的业务数据 . 不能为 resource 类型,其他类型最终将转化为json形式的字符串
// ( jobData 为对象时,需要在先在此处手动序列化,否则只存储其public属性的键值对)
$jobData = [ 'name'=>'zhangsan'.time()] ;
// 4.将该任务推送到消息队列,等待对应的消费者去执行
$isPushed = Queue::push( $jobHandlerClassName , $jobData , $jobQueueName );
// database 驱动时,返回值为 1|false ; redis 驱动时,返回值为 随机字符串|false
if( $isPushed !== false ){
echo date('Y-m-d H:i:s') . " a new Hello Job is Pushed to the MQ"."<br>";
}else{
echo 'Oops, something went wrong.';
}
}
}
<?php
namespace app\admin\controller;
use PHPMailer\PHPMailer\PHPMailer;
use think\Db;
use think\Loader;
use think\queue\Job;
class Demo
{
/**
* fire方法是消息队列默认调用的方法
* @param Job $job 当前的任务对象
* @param array|mixed $data 发布任务时自定义的数据
*/
public function fire(Job $job,$data){
$isJobDone = $this->doHelloJob($data);
if ($isJobDone) {
//如果任务执行成功, 记得删除任务
$job->delete();
print("<info>Hello Job has been done and deleted"."</info>\n");
}else{
if ($job->attempts() > 3) {
//通过这个方法可以检查这个任务已经重试了几次了
print("<warn>Hello Job has been retried more than 3 times!"."</warn>\n");
$job->delete();
}
}
}
/**
* 根据消息中的数据进行实际的业务处理
* @param array|mixed $data 发布任务时自定义的数据
* @return boolean 任务执行的结果
*/
private function doHelloJob($data) {
// 根据消息中的数据进行实际的业务处理...
Loader::import('PHPMailer.PHPMailer');//加载extend中的自定义类
$mail = new PHPMailer(); //实例化
header("content-type:text/html;charset=utf-8");
// 使用SMTP方式发送
$mail->IsSMTP();
// 设置邮件的字符编码
$mail->CharSet='UTF-8';
// 企业邮局域名
$mail->Host = 'smtp.qq.com';
//---------qq邮箱需要的------//设置使用ssl加密方式登录鉴权
$mail->SMTPSecure = 'ssl';
//设置ssl连接smtp服务器的远程服务器端口号 可选465或587
$mail->Port = 465;//---------qq邮箱需要的------
// 启用SMTP验证功能
$mail->SMTPAuth = true;
//邮件发送人的用户名(请填写完整的email地址)
$mail->Username = '729347004@qq.com' ;
// 邮件发送人的 密码 (授权码)
$mail->Password = 'lxiiemuacxjgbbeb'; //修改为自己的授权码
//邮件发送者email地址
$mail->From ="729347004@qq.com";
//发送邮件人的标题
$mail->FromName ="购买成功";
//收件人的邮箱 给谁发邮件
// $email_addr = "519660157@qq.com";
$email_addr = "729347004@qq.com";
//收件人地址,可以替换成任何想要接收邮件的email信箱,格式是AddAddress("收件人email","收件人姓名")
$mail->AddAddress("$email_addr", substr( $email_addr, 0 , strpos($email_addr ,'@')));
//回复的地址
$mail->AddReplyTo('729347004@qq.com' , "" );
$mail->AddAttachment("./mail.rar"); // 添加附件
//set email format to HTML //是否使用HTML格式
$mail->IsHTML(true);
//邮件标题
$mail->Subject = '购买成功通知';
//邮件内容
$mail->Body = "<p style='color:red;font-size: 20px'>" . '恭喜您!预约成功,请您按时就诊哦!' . '</p>'."<p></p>";
//附加信息,可以省略
$mail->AltBody = '';
// 添加附件,并指定名称
$mail->AddAttachment( './error404.php' ,'php文件');
//设置邮件中的图片
$mail->AddEmbeddedImage("shuai.jpg", "my-attach", "shuai.jpg");
if( !$mail->Send() ){
$mail_return_arr['mark'] = false ;
$str = "邮件发送失败. <p>";
$str .= "错误原因: " . $mail->ErrorInfo;
$mail_return_arr['info'] = $str ;
}else{
$mail_return_arr['mark'] = true ;
$str = "邮件发送成功";
$mail_return_arr['info'] = $str ;
}
}
}
调用一次
php think queue:listen --queue helloJobQueue
一直执行
php think queue:work --daemon --queue helloJobQueue
访问
http://www.medical.com/admin/Test/actionWithHelloJob
http://www.bakk.com/index.php/admin/Test/actionWithHelloJob