1.安装ThinkPHP6.0框架
composer create-project topthink/think tp
2.安装多应用
composer require topthink/think-multi-app
3.配置多应用模式
3.1删除原来app目录下的controller文件夹
3.2修改配置文件开启多应用模式,在config/app.php文件下增加以下内容
// 设置默认应用名称
'default_app' => 'home',
// 开启自动多模式
'auto_multi_app' => true,
// 开启应用快速访问
'app_express' => false,
4.创建demo应用目录
php think build 项目名
4.1因为我使用的前后端分离所以这里新增中间件文件夹和路由文件夹
项目名/middleware/Codelogin.php 根据业务需求改里面的内容
<?php
// 这是全局中间件
namespace app\admin\middleware;
use think\facade\Db; // 数据库的链接
class Codelogin
{
public function handle($request, \Closure $next)
{
if (empty(@$_SERVER['HTTP_AUTHORIZATION'])) {
return json(array('code' => 401, 'msg' => '请先登录!'));
}
$token = checkToken(str_replace("Bearer ", "", @$_SERVER['HTTP_AUTHORIZATION']));
if ($token['code'] != 200) {
return json(array('code' => 401, 'msg' => $token['msg']));
}
$admin = Db::name('store_info')->where('id', $token['data']['UserID'])->find();
// 判断是否被禁用
if ($admin ['status'] == 2 || $admin ['status'] == 3) {
return json(array('code' => 401, 'msg' => '账号异常,不能操作!'));
}
// 判断密码
if (@$admin ['pass'] != @$token['data']['pass']) {
return json(array('code' => 401, 'msg' => '密码错误!'));
}
$request->AdminId = $token['data']['UserID'];
return $next($request);
}
}
4.2 路由 项目名/route/route.php
<?php
// +----------------------------------------------------------------------
namespace app\admin\route;
use think\facade\Route;
Route::rule('userInfo', 'Login/userInfo', 'get');
Route::rule('login', 'Login/index', 'post');
5.安装jwt(加密和解密token)
composer require firebase/php-jwt
6.安装ThinkPHP6.0的图形验证码
composer require topthink/think-captcha
6.1前后端分离注意(使用redis 做缓存把验证码缓存到redis里面),改vendor/topthink/think-captcha/src/Captcha.php文件
// 引入
use think\facade\Cache;
// 在到 generate方法的 128行左右
$this->session->set('captcha', [
'key' => $hash,
]);
// 改成
$this->session->set('captcha', [
'key' => $hash,
]);
Cache::store('redis')->set('captcha'.request()->ip(),$hash,80);
// 在check方法里面的 (可以删掉)
if (!$this->session->has('captcha')) {
return false;
}
$key = $this->session->get('captcha.key');
// 改成
$key = Cache::store('redis')->get('captcha'.request()->ip());
7.安装微信第三方SDK(要求>=php7.0版本) SDK的文档地址
composer require overtrue/wechat:~4.0 -vvv
8.安装阿里云的oss对象存储
composer require aliyuncs/oss-sdk-php
9.安装短信SDK
// 阿里云
composer require alibabacloud/dysmsapi-20170525
// 腾讯云
composer require tencentcloud/tencentcloud-sdk-php
10.ThinkPHP6.0队列
composer require topthink/think-queue
10.1使用在文件里面引入 use think\facade\Queue;
// 发送发布:任务名, 参数, 队列名 发消息
// Queue::push('app\api\job\Test@方法', 参数, 配置文件下的queue.php下的redis.queue 的命名);
Queue::push('app\api\job\Test@doTask', $data, $job_queue_name);
10.2在配置文件创建一个queue.php
<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006-2016 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: yunwuxin <448901948@qq.com>
// +----------------------------------------------------------------------
return [
'default' => 'redis',
'connections' => [
'sync' => [
'type' => 'sync',
],
'database' => [
'type' => 'database',
'queue' => 'default',
'table' => 'jobs',
'connection' => null,
],
'redis' => [
'type' => 'redis',
'queue' => 'testTask',
'host' => '127.0.0.1',
'port' => 6379,
'password' => '',
'select' => 0,
'timeout' => 0,
'persistent' => false,
],
],
'failed' => [
'type' => 'none',
'table' => 'failed_jobs',
],
];
10.3创建文件夹,在应用目录或在app下创建 job/test.php,test.php代码如下
<?php
namespace app\api\job;
use think\queue\Job;
class Test{
/**
* 创建任务类
*推荐使用 app\job 作为任务类的命名空间 也可以放在任意可以自动加载到的地方
*任务类不需继承任何类,如果这个类只有一个任务,那么就只需要提供一个fire方法就可以了,如果有多个小任务,就写多个方法,下面发布任务的时候会有区别
*还有个可选的任务失败执行的方法 failed 传入的参数为$data(发布任务时自定义的数据)
* @param Job $job 当前的任务对象
* @param $data 发布任务时自定义的数据
*/
public function fire(Job $job, $data){
// ....这里执行具体的任务
try{
// ....这里执行具体的任务
echo "1执行逻辑\n";
if (1 == 1) {
// 成功删除任务
$job->delete();
}else{
// 此任务超过3次则三次
if ($job->attempts() > 3) {
//通过这个方法可以检查这个任务已经重试了几次了
// todo .... 删除前逻辑
$job->delete();
}
// 不成功延迟2发再次发布
$job->release(2);
}
}catch(\Exception $e){
// 通过这个方法可以检查这个任务已经重试了几次了
if ($job->attempts() > 3) {
// todo .... 删除前逻辑
$job->delete();
}
}
}
/**
* 执行逻辑
* @param $data 数据
* @return bool 返回结果
*/
public function doTask(Job $job, $data){
echo "2执行逻辑\n";
$job->delete();
}
/**
* 发布失败
* @param $data
*/
public function failed($data){
// todo ...任务达到最大重试次数后,失败了
}
}
11.高并发数据处理 - 锁 对应文档(英文)
composer require "malkusch/lock"
11.1锁的使用 (redis 举例)引入use malkusch\lock\mutex\PHPRedisMutex;
$redis = new \Redis();
$redis->connect("localhost");
// redis , 昵称 , 释放时间
$mutex = new PHPRedisMutex([$redis], "balance_".$id,10);
$mutex->synchronized(function () use ($id){
sleep(5);
echo $id."Hello, World!\n";
});
12.二维码生成
composer require endroid/qr-code