TP5 报错 Cannot declare class Composer\Autoload\ComposerStaticInitc **** because the name is already in use 作者: HAS 时间: 2022-01-14 分类: PHP 评论  ## 原因是 TP5框架会自动引入 资源,不需要再次引用 autoload.php 把下面的代码注释了就行 ```php require dirname(__FILE__) .'/../vendor/autoload.php'; ```
Vue 子组件 修改父组件值 作者: HAS 时间: 2021-12-08 分类: Vue 评论 记录一下,防止自己忘了 ### 密码验证的组件:  ### 需要的功能: 当用户点击验证按钮并且密码正确时 将验证结果返回给父组件 这里是父组织使用子组件: 1.父组件定义公用值,就是为了让子组件用的,并把值给子组件,使用bind 把值绑给他 ```html ``` 2.然后在子组件里进行接收  3.子组件触发改动事件  在触发之前需要在父组件定义一个v-on事件和一个接收方法 接收方法:  我这里定义的是validationpwd,后面的是传递值 触发时: this.$emit("validationSecondary",1); 
PHP 生成二维码API 作者: HAS 时间: 2021-06-16 分类: PHP 评论 **手动生成地址**:https://qrcode.haser.top/ ------------ **API地址**:https://qrcode.haser.top/api.php?qrcode | 参数 | 是否必须 |说明| | ------------ | ------------ | | data | 是 | 生成的内容| | size | 否 |生成二维码的大小 取值范围:1-10| **完整示例**:https://qrcode.haser.top/api.php?qrcode&data=haser.top/&szie=9 生成效果: 
PHP 两步验证接入 作者: HAS 时间: 2021-06-15 分类: PHP 评论 这其实就是「两步验证」或者叫做「双因素验证」的一种实现方式,它这里第二步验证是靠手机短信来发送验证码的。而国外更多的网站/网络服务还会使用一种叫“身份验证器”或叫“虚拟 MFA”的二步验证方式,它是利用一种“随时间变化的验证码”来取代手机短信,不仅更安全,而且可离线使用,通用性也更强 ```php //引用GoogleAuthenticator类 include ('Gangsta/GoogleAuthenticator.php'); $ga = new \PHPGangsta_GoogleAuthenticator(); //这是生成的密钥,每个用户唯一一个,为用户保存起来用于验证 $secret = $ga->createSecret(); //下面为生成二维码,内容是一个URI地址(otpauth://totp/账号?secret=密钥&issuer=标题) $qrCodeUrl = $ga->getQRCodeGoogleUrl(userall("name"), $secret, 'HAS平台二步认证'); ``` ```php //验验证码是否于密钥匹配 $code = $_REQUEST["code"];//用户输入的验证码 $secretu = "";//刚刚生成的唯一密钥 if ($ga->verifyCode($secretu,$code,1)){//验证成功 echo "0"; }else{//验证失败 echo "1"; } ``` 接入逻辑: 用户登录系统之后检查数据是否存在两步验证密钥,如果没有将生成的二维码显示在前台,引导用户使用"谷歌身份验证器" 扫码绑定,用户扫码绑定之后引导用户输入"谷歌身份验证器"显示六位数验证码,进行比对,如果比对成功,密钥保存到数据库中,下次可以在需要二步验证的时候读取密钥 [点击下载GoogleAuthenticator类](https://cnd.haser.top/2021/06/15/3515418572.zip "点击下载GoogleAuthenticator类")
Redis的缓存雪崩,缓存穿透,缓存击穿 作者: HAS 时间: 2021-05-18 分类: 默认的分类 评论 # 缓存雪崩 在**高并发下**,大量缓存**key在同一时间失效**,大量请求直接落在数据库上,导致数据库宕机。 ## 解决方案 • 随机设置key失效时间,避免大量key集体失效。 setRedis(Key,value,time + Math.random() * 10000); 复制代码 • 若是集群部署,可将热点数据均匀分布在不同的Redis库中也能够避免key全部失效问题 • 不设置过期时间 • 跑定时任务,在缓存失效前刷进新的缓存 # 缓存穿透 不断地访问redis和数据库里**没有的数据**, 比如用户id从1开始,攻击请求不断地请求 -1 这个数据,因为redis没有这个缓存**只能不断地去数据库查询** ,最终导致数据库压力过大宕机 ## 解决方案 对不存在的数据缓存到redis中,设置key,value值为null(不管是数据未null还是系统bug问题),并设置一个短期过期时间段,避免过期时间过长影响正常用户使用。 拉黑该IP地址 对参数进行校验,不合法参数进行拦截 布隆过滤器 将所有可能存在的数据哈希到一个足够大的bitmap(位图)中,一个一定不存在的数据会被 这个bitmap拦截掉,从而避免了对底层存储系统的查询压力。 # 缓存击穿 **热点数据在高并发**,但是在**一瞬间key过期**,导致之后的请求**全部需要查询数据库**,导致数据库压力过大,最终宕 ## 解决方案 设置热点数据"永不过期" 加上互斥锁:上面的现象是多个线程同时去查询数据库的这条数据,那么我们可以在第一个查询数据的请求上使用一个互斥锁来锁住它 其他的线程走到这一步拿不到锁就等着,等第一个线程查询到了数据,然后将数据放到redis缓存起来。后面的线程进来发现已经有缓存了,就直接走缓存