로컬 환경:
시스템 상태: Mac Os
php 버전: 7.1
ThinkPHP 버전: 5.1.15
최근에 think-를 봤습니다. queue 이 확장 클래스는 매뉴얼에 작성되어 있지 않아서 머리가 아팠습니다. 많은 정보를 찾아 결국 장면을 작성했습니다. 먼저 tp 프레임워크를 다운로드하여 프로젝트를 작성했습니다. -queue 확장을 만듭니다.
보려면 프로젝트 디렉터리를 입력하세요.
확장 클래스를 다운로드하세요.
다운로드 후 다음을 입력하고 확인하세요.
그런 다음 MAMP를 사용하여 가상을 만듭니다.
그런 다음 데이터베이스와 데이터 테이블을 생성합니다.
create database if not exists myproject; use myproject; DROP TABLE IF EXISTS member; CREATE TABLE IF NOT EXISTS member( id int(11) AUTO_INCREMENT primary key comment 'ID', email VARCHAR(32) NOT NULL DEFAULT '' COMMENT '', password VARCHAR(255) NOT NULL default '' comment '', create_time INT(11) UNSIGNED NOT NULL DEFAULT 0 comment '', update_time INT(11) UNSIGNED NOT NULL DEFAULT 0 comment '', unique key (email) )engine innodb charset utf8;Redis 서비스를 시작합니다.
그 후 필수 라우팅 켜기, 데이터베이스 구성, 라우팅 구성, 템플릿 태그 구성과 같은 일련의 작업이 수행됩니다. 등...
Member.php 모델 디렉터리 만들기: application/index/model/Member.php
Register.php 유효성 검사 디렉터리 만들기: application /index/validate/Register.php큐 처리를 위한 sendActivationMail.php 파일 생성 디렉토리: application/index/job /sendActivationMail.php
Register 컨트롤러에 작업 메소드
<?php /** * User: 李昊天 * Date: 18/6/7 * Time: 上午3:15 * Email: haotian0607@gmail.com */ namespace app\index\controller; use think\Controller; use app\index\model\Member as MemberModel; use app\index\validate\Register as RegisterValidate; use think\Queue; class Register extends Controller { private $model = ''; public function initialize() { $this->model = new MemberModel(); } /** * 渲染模板 展示注册页面 * @return mixed */ public function index() { return $this->fetch('index'); } /** * 执行注册逻辑 */ public function doRegister() { if ($this->request->isPost()) { #实例化验证器 执行验证 如果验证失败跳转并且提示 $validate = new RegisterValidate(); $data = $this->request->post(); if (false === $validate->check($data)) return $this->error($validate->getError()); //此处应该加密密码 md5 sha1 hash 都可以 //写入注册的用户 $result = $this->model->allowField(['email', 'password'])->save($data); if ($result) { //注册完毕后获取到邮件账号 然后加入到队列 $this->sendActivationMail($this->model->email); return $this->success('注册成功,请前往邮箱激活您的账号!'); } else { return $this->error('注册失败'); } } } /** * @param string $email 邮箱账号 */ private function sendActivationMail($email = '') { $jobName = 'app\index\job\sendActivationMail'; //负责处理队列任务的类 $data = ['email' => $email]; //当前任务所需的业务数据 $jobQueueName = 'sendActivationMail'; //当前任务归属的队列名称,如果为新队列,会自动创建 $result = Queue::push($jobName, $data, $jobQueueName); if ($result) { echo date('Y-m-d H:i:s') . '一个新的队列任务'; } else { echo date('Y-m-d H:i:s') . '添加队列出错'; } // php think queue:work --queue sendActivationMail --daemon } }sendActivationMail.php를 생성합니다
.
<?php /** * User: 李昊天 * Date: 18/6/7 * Time: 上午3:36 * Email: haotian0607@gmail.com */ namespace app\index\job; use think\queue\Job; use PHPMailer\Mail; use think\Exception; class sendActivationMail { /** * fire方法是消息队列默认调用的方法 * @param Job $job 当前的任务对象 * @param $data 发布任务时自定义的数据 */ public function fire(Job $job, $data) { //执行发送邮件 $isJobDone = $this->sendMail($data); //如果发送成功 就删除队列 if ($isJobDone) { print ("<warn>任务执行成功,,已经删除!" . "</warn>\n"); $job->delete(); } else { //如果执行到这里的话 说明队列执行失败 如果失败三次就删除该任务 否则重新执行 print ("<warn>任务执行失败!" . "</warn>\n"); if ($job->attempts() > 3) { print ("<warn>删除任务!" . "</warn>\n"); $job->delete(); } else { $job->release(); //重发任务 print ("<info>重新执行!第" . $job->attempts() . "次重新执行!</info>\n"); } } } /** * 发送邮件 * @param $data * @return bool */ private function sendMail($data) { $title = '账号激活邮件'; $msg = '欢迎您注册xxx网站,您的请点击一下连接激活您的账号!....'; try { return Mail::send($title, $msg, $data['email']); } catch (Exception $e) { return false; } } }가 작성되었습니다. 실행을 위해 컨트롤러를 현재 디렉터리로 전환하세요
php think queue:work --queue sendActivationMail --daemon
코드에 매우 자세한 설명이 있지만 이는 완료되지 않았습니다.,, 오류 콜백이 없습니다. 나머지는 제가 작성하겠습니다. 코드는 다음에 시간날 때