只要文件夹

2022年 9月 25日 Read all

原型产品使用的 thinkphp+mysql+redis开发的 纯api,由于并发太大,php吃资源离谱。基于节约成本考虑,直接用go重写 。数据库 依旧是原来数据库。 总共30几个接口,历时一个月从零开始学习go并完成迁移工作。先重写大并发接口,而后逐个线上替换。 go主要用的库 jsonparser 是一个json处理库,比自带的encoding/json速度要快,但encoding/json更灵活一些,所以都使用了 fasthttp 是一个更加高性能的web服务,在多并发的时候 线程复用更强大 但是 依旧使用了 net/http 来处理一些 第三方sdk 感受和优势 1、vscode自带代码校验,大错误小错误都会提示,代码低级失误较少。代码自动格式化 2、不需要搭建环境,golang官方直接下载 安装即可,zip的话添加一个系统变量即可使用 3、可以不依赖nginx,当然基于ssl gzip 日志 等需求,前端还是套一个nginx 简单一些 4、编译速度很快,在vscode可以简单重新编译调试,4秒左右 5、直接导出二进制文件,不用担心源码泄露 尤其是源码里面的一些密码部分。比如md5的二次加密密钥等 6、计划任务 定时任务,可以直接单开一个线程处理,不依赖前台php文件唤起(当然 shell php也可以)go处理起来 很简单只需要一行 go cron_tab() //并发任务 即可 7、宝塔自带守护进程,不需要自己另外守护 8、fmt.Println fmt.Fprint(ctx, "{}") 的日志输出,开发过程中监控运行状态更简单 9、跨平台 依旧有高性能,win linux mac arm均可以搞定 10、可以开发简单的 客户端软件。同语言 搞起来省心 11、包管理和源码文件 管理,没有php方便 ,需要用go mod 或者第三方框架 12、go和php相比,强类型需要时间适应,另外很多函数需要自己复写。go的异常处理 较为啰嗦,原生开发go的话,需要自己写大量简单的函数来封装 以便主流程代码简洁比如 md5 函数 还有 json和map互转 等等 13、字符类型转化 很啰嗦,甚至 int int8 int16 之间转化 代码啰嗦,不过按需使用 可以做到更快的运行速度和极限的更低的资源占用

2022年 9月 19日 Read all

php终于支持jit了,而1996年java已经支持jit php8.0 默认情况下 和php7.4性能基本接近,但是开启jit后 在cpu密集计算的情况下可以提升92%左右的性能,比php5 性能提升5-7倍 PHP 8 的 JIT(Just In Time)编译器将作为扩展集成到 php 中 Opcache 扩展 用于运行时将某些操作码直接转换为从 cpu 指令,大概来说就是之前版本的Opcache 可以跳过编译解释直接机器码到zend,而jit跳过zend 直接到cpu指令 。PHP 的 JIT 使用了名为 DynASM (Dynamic Assembler) 的库,该库将一种特定格式的一组 CPU 指令映射为许多不同 CPU 类型的汇编代码。 因此,编译器只需要使用 DynASM 就可以将 Opcodes 转换为特定结构体的机器码。 JIT编译原理 1、检查opcodes是否缓存 2、zend compiler编译器进行编译生成opcodes 3、optimizer优化器生成优化后的opcodes 4、把优化后的opcodes放入opcodes cache缓存 5、jit编译器把optimized opcodes再次编译成汇编机器码machine codes 6、进入zend vm虚拟前先检查是否开启jit引擎 7、如果已经开启了jit引擎则直接读取机器码中的jit buffer代码片段 8、送入x86 cpu架构进行执行 其他要明白的 1、Opcache会做opcode层面的优化,比如图中的两条opcode合并为一条 2、PHP8的JIT目前是在Opcache之中提供的 3、JIT在Opcache优化之后的基础上,结合Runtime的信息再次优化,直接生成机器码 4、JIT不是原来Opcache优化的替代,是增强 5、目前PHP8只支持x86架构的CPU arm还要等着 当然如果php只是处理一些io操作,那么你用php5 还是php8 都差不多,因为性能瓶颈在io上而不是cpu上。如果是IO 密集型操作的 应用,开启jit反而可能会有10%左右的性能消耗 ,尤其是Laravel。 在密集计算的情况下,对比php7.4 和 未开机jit的php8 性能提升差不多是92%-120% ,也就是1倍左右。 当然 即便是开启了 jit,在密集计算上,php的性能依旧被 node.js java C# go C++ 吊打 至于为什么使用php 这个各取所需的话题没啥可说的 所以还是尽快升级到php8 刚刚在宝塔中查看,已经支持到8.1.9 性能再提升4%左右 新项目不用考虑 直接上了。 在php.ini 中看到 opcache.jit_buffer_size=128mopcache.jit=1205 宝塔默认帮开启了,opcache.jit这个配置由4个独立的数字组成,分别代表 是否使用AVX指令 寄存器分配策略 JIT触发策略 JIT优化策略 具体查看php8手册 值得注意的时php8.1.9下 部分扩展可能尚未支持 libssh2 【依赖关系如下:PECL/ssh2 –> libssh2 –> openssl】 sg11 常用的扩展 swoole redis之类的肯定都是没问题的

2022年 8月 29日 Read all

前言 我宝塔运行在 unraid+kvm > alpine+docker里面 为什么不直接 unraid+docker 是因为 我对性能的损耗不怎么在意,物理机性能嗷嗷的 虚拟机的隔离 还有整机备份更加方便。 为什么非要用docker跑宝塔?因为docker配合阿里云免费私有库 整机备份和迁移也方便。 我可以docker stop baota之后 用export和import备份整个容器到新镜像,然后push到阿里云私有库上。在其他机器上直接运行。而不需要重复环境。 alpine 作为一个安装后之占用几十m硬盘的Linux系统非常适合何种虚拟机运行,而且官网有提供适合虚拟机的iso docker运行宝塔的几个问题 主要是物理机开机启动后,宝塔不能自动运行 。这里以alpine+docker+centos7+宝塔 为例 在/www/wwwroot新建文件 bt.sh 给运行权限 代码如下 /etc/init.d/bt start /etc/init.d/redis start /etc/init.d/php-fpm-74 start /etc/init.d/mongodb start /etc/init.d/mysqld start /etc/init.d/nginx start crond /etc/init.d/mysqld start #再启动一次,有时候 一次启动不起来 其他版本 和宝塔环境可以ls /etc/init.d/ 执行权限 docker exec -it baota chmod +x /www/wwwroot/bt.sh 然后把这个 /www/wwwroot/bt.sh 这个脚本添加到宿主机的开机启动启动里面(Windows 也可以) 以alpine3.6.1为例,在宿主机 新建一个local启动服务脚本 运行刚刚新建的bt.sh 必须以start作为后缀 vi /etc/local.d/bt.start docker exec -it baota sh /www/wwwroot/bt.sh 执行权限 chmod +x /etc/local.d/bt.start 更新和添加local启动项 rc-update add local 重启机器测试,发现都可以正常启动了 crond 这个 是解决宝塔的计划任务不能自动执行的

2022年 8月 4日 Read all

maccms是一个优秀的电影网站管理程序 一直以来很受灰产欢迎哈,但是它也确实很优秀。 我是通过maccms开始深入了解到thinkphp。更是基于maccms二开过几个小项目。 至今也自行维护了一个盗版电影网站 供自己和好友观看 这个小建议 没想到会获得作者的认可 issues: https://github.com/magicblack/maccms10/issues/934 update: https://github.com/magicblack/maccms10/releases/tag/v2022.1000.3032

2022年 8月 4日 Read all

除了nginx apache自带的方法,这里加一个php的。那个php需要控制用户使用,那个php 里面包含一下 require "inc_index_psw.php"; 代码 <?php /* * 在首页中 // include "inc_index_psw.php"; 可以强制输入密码cd */ $My_agent = $_SERVER['HTTP_USER_AGENT']; // 先判断 if(strpos($_SERVER['HTTP_CF_WORKER'],'yanhui.com') ==false && strpos($My_agent,'mirror') ==false) { //判断是qq或者微信打开的嘛 if(strpos($My_agent, 'QQ/')||strpos($My_agent, 'MicroMessenger')!==false){ html_browser(); die; } //获取登录状态 $my_is_logined=0; if(isset($_COOKIE['my_is_logined']) ){ $my_is_logined=(int)$_COOKIE['my_is_logined']; } // 未登录 if($my_is_logined!=1){ //开始判断和验证登录 $my_chk_login=0; if(isset($_POST['my_chk_login']) ){ $my_chk_login=(int)$_POST['my_chk_login']; } if($my_chk_login==1){ //验证登录信息和密码 if(trim($_POST['my_psw'])=="admin" || trim($_POST['my_psw'])=="123456" || trim($_POST['my_psw'])=="123" || trim($_POST['my_psw'])=="abc"){ //登录成功 setcookie('my_is_logined','1',time()+365*24*60*60,'/'); //一年有效 die ("<script language=JavaScript> location.replace(location.href);</script>"); }else{ die("<script>alert('密码错误');history.go(-1)</script>"); } }else{ //输出登录界面 html_login(); } die; } } function html_browser(){ ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>使用浏览器打开</title> <meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" name="viewport"> <meta content="yes" name="apple-mobile-web-app-capable"> <meta content="black" name="apple-mobile-web-app-status-bar-style"> <meta name="format-detection" content="telephone=no"> <meta content="false" name="twcClient" id="twcClient"> <meta name="aplus-touch" content="1"> <style> body,html{width:100%;height:100%} *{margin:0;padding:0} body{background-color:#fff} #browser img{ width:50px; } #browser{ margin: 0px 10px; text-align:center; } #contens{ font-weight: bold; margin:-285px 0px 10px; text-align:center; font-size:20px; margin-bottom: 125px; } .top-bar-guidance{font-size:15px;color:#fff;height:60%;line-height:1.8;padding-left:20px;padding-top:20px;background:url(//gw.alicdn.com/tfs/TB1eSZaNFXXXXb.XXXXXXXXXXXX-750-234.png) center top/contain no-repeat} .top-bar-guidance .icon-safari{width:25px;height:25px;vertical-align:middle;margin:0 .2em} .app-download-tip{margin:0 auto;width:290px;text-align:center;font-size:15px;color:#2466f4;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAcAQMAAACak0ePAAAABlBMVEUAAAAdYfh+GakkAAAAAXRSTlMAQObYZgAAAA5JREFUCNdjwA8acEkAAAy4AIE4hQq/AAAAAElFTkSuQmCC) left center/auto 15px repeat-x} .app-download-tip .guidance-desc{background-color:#fff;padding:0 5px} .app-download-btn{display:block;width:214px;height:40px;line-height:40px;margin:18px auto 0 auto;text-align:center;font-size:18px;color:#2466f4;border-radius:20px;border:.5px #2466f4 solid;text-decoration:none} </style> </head> <body> <div class="top-bar-guidance"> <p>点击右上角<img src="//gw.alicdn.com/tfs/TB1xwiUNpXXXXaIXXXXXXXXXXXX-55-55.png" class="icon-safari"> <span id="openm">Safari打开</span></p> <p>可以继续浏览本站哦~</p> </div> <a style="display: none;" href="" id="vurl" rel="noreferrer"></a> <div id="browser"> <p>避免微信和QQ屏蔽本站网址,请理解支持!</p> </div> <div class="app-download-tip"> <span class="guidance-desc">点击右上角或复制网址自行打开</span> </div> <link href="/static/layui/css/modules/layer/default/layer.css" rel="stylesheet" type="text/css" /> <script src="https://cdn.bootcdn.net/ajax/libs/jquery/1.9.1/jquery.min.js"></script> <script src="/static/js/jquery.clipboard.js"></script> <script src="/static/layui/lay/modules/layer.js"></script> <a data-clipboard-text="<?php echo curPageURL(); ?>" class="app-download-btn">点此复制本站网址</a> <script type="text/javascript"> new ClipboardJS(".app-download-btn"); $(".app-download-btn").click(function() { layer.tips("复制成功,么么哒", ".app-download-btn", { tips: [3, "rgb(38,111,250)"], time:500 });}) </script> <script> function openu(u){ document.getElementById("vurl").href= u; document.getElementById("vurl").click(); } var url = window.location.href; if(navigator.userAgent.indexOf("QQ/")> -1){ openu("ucbrowser://"+url); openu("mttbrowser://url="+url); openu("baiduboxapp://browse?url="+url); openu("googlechrome://browse?url="+url); openu("mibrowser:"+url); openu("taobao://"+url.split("://")[1]); openu("alipays://platformapi/startapp?appId=20000067&url="+url); $("html").on("click",function(){ openu("ucbrowser://"+url); openu("mttbrowser://url="+url); openu("baiduboxapp://browse?url="+url); openu("googlechrome://browse?url="+url); openu("mibrowser:"+url); openu("taobao://"+url.split("://")[1]); openu("alipays://platformapi/startapp?appId=20000067&url="+url); }); }else if(navigator.userAgent.indexOf("MicroMessenger") > -1){ if(navigator.userAgent.indexOf("Android") > -1){ var iframe = document.createElement("iframe"); iframe.style.display = "none"; document.body.appendChild(iframe); }else{ } }…

2022年 8月 3日 Read all

#引言 因为cf work反代发现一点问题,所以还是换成 #申请免费php空间 暂时用 https://www.yun316.net/ 免费一个月,每个月要去免费续费一次,也可以支付5元 1年免续费 偶尔会出现503错误的哈,但是免费的没啥说的。 #配置环境 php版本 5.5 #伪静态规则[在ftp文件规则下面] <IfModule mod_rewrite.c> RewriteEngine on RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] </IfModule> #下载一个7ghost,配置一下 上传到ftp #为了避免被墙,首页 index.php 添加代码 require "inc_index_psw.php"; inc_index_psw.php 文件内容 https://dev.leiyanhui.com/c/128 也可 使用yun316后台的http认证功能 ssl访问 免费空间不支持ssl 总不能明文搜索一些 吧。 所以 套上cf 或者 cdn

2022年 8月 3日 Read all

因为某些模板有自定义字段,导致自定义字段 一直展开状态 ,发布按钮 就到了第二页 导致使用起来不方便 admin目录下 custom-fields.php 第7行 <section id="custom-field" class="typecho-post-option<?php if (empty($defaultFields) && empty($fields)): ?> fold<?php endif; ?>"> 修改为 <section id="custom-field" class="typecho-post-option fold"> 或者 (条件里面 加一个 11 ) <section id="custom-field" class="typecho-post-option<?php if (empty($defaultFields) && empty($fields) || 1==1) : ?> fold<?php endif; ?>">

2022年 8月 3日 Read all

https://www.yun316.net/

2022年 8月 3日 Read all

用户身份 IP 设备序号 用户id 用户手机设备cid 可伪造 不用于识别用户 硬件设备 根据ip限制 单ip 单位分钟只可以查询 N次数据库 单i 单位时间内 只可以查询N次 redis <> 包括上传数据 根据mac限制 即便是有效的mac 单位时间内只可以操作N次redis 用户app 根据IP 单ip 单位时间内 只可以查询N次数据库检查用户密码 单ip 单位时间内 只可以查询N次redis检查用户密码 根据用户id 单用户 单位时间内只可以查N次redis 单用户 单位时间内只可以查N次redis 根据设备和app区分 设备上报日志 获取返回值 查询redis 根据ip 限制 1分钟内400次 limit.dev.redis.ip.xxx.m. 根据mac 限制 1分钟内40次 limit.dev.redis.mac.xxx.m. 查询数据库 根据ip限制 1分钟内60次 limit.dev.mysql.ip.xxx.m. 根据mac 限制 1分钟内1次 limit.dev.mysql.mac.xxx.m. APP = > 登录 和 用id token检查登录 查询redis 根据ip 限制 1分钟内120次 limit.app.login.redis.ip.xxx.m. 查询数据库 根据ip限制 1分钟内100次 limit.app.login.mysql.ip.xxx.m. APP => 获取手机验证码 手机号要先存在 查询数据库 根据ip 限制 1分钟内120次 limit.app.sms.mysql.ip.xxx.m. 发送SMS 1分钟内1次 limit.app.sms.phone.xxx.m. 1天3次 limit.app.sms.phone.xxx.day. App => 获取设备日志 根据IP 查询用户日志 1分钟限制600次 limit.app.getlog.redis.ip.xxx.m. 1小时限制3600次 limit.app.getlog.redis.ip.xxx.hour. 根据用户id 1分钟限制600次 limit.app.getlog.redis.userid.xxx.m. App => 常规操作 根据IP 查询操作redis 1分钟600次 limit.other.redis.ip.xxx.m. 1小时3600次 limit.other.redis.ip.xxx.hour. 查询操作数据库 1分钟600次 limit.other.mysql.ip.xxx.m. 1小时3600次 limit.other.mysql.ip.xxx.m.

2022年 8月 3日 Read all

如果可以在php里面搞定,尽量不弄nginx的,以免影响迁移 nginx配置 add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Methods 'GET,POST,PUT,DELETE,PATCH,OPTIONS'; add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization'; php // 设置允许其他域名访问 header('Access-Control-Allow-Origin:*'); //header('Access-Control-Allow-Origin: '.$_SERVER['HTTP_ORIGIN'].''); // 设置允许的响应类型 header('Access-Control-Allow-Methods:POST, GET,OPTIONS, PUT, DELETE'); // 设置允许的响应头 header('Access-Control-Allow-Headers:x-requested-with,content-type,Origin, Accept, Authorization'); thinkphp 直接放到 应用的index.php 就可以了

2022年 8月 3日 Read all

看了很多资料 目前最靠谱的解决方法 比如 leiyanhui.com 域名托管在 dnspod leiyanhui.com mx记录到腾讯企业邮箱 leiyanhui.com url转发到 www.leiyanhui.com 会自动A记到腾讯的url转发服务器 如果dns在cloudflare那就简单,直接做cname 就可以,cloudflare会自动拉平成A记录 另外一个解决方法 就是 域名 使用 user@mail.leiyanhui.com 这样的方式 也可以避免冲突 网上说是那些ALIAS 记录 目前 多数dns不支持 不太靠谱

2022年 8月 3日 Read all

/application/admin/controller/Collect.php public function vod($param) 函数 最后一段 280行 model('Collect')->vod_data($param,$res ); 在这行代码之前添加 mac_echo('<title>'.$param['page'].'/'.$res['page']['pagecount'].'</title>');

2022年 8月 3日 Read all

简单的说 就是 用ssh-keygen 创建 私钥和公钥,公钥内容 添加到 /root/.ssh/authorized_keys 然后配置ssh 使用这个私钥

2022年 8月 3日 Read all

2021年之前,这个不用想,肯定是无脑 jsdelivr+github 现在,很多人选择了 阿里云或者腾讯的对象储存+cdn 不是说不行吧。只是还是有一点小费用产生。 境外的话,肯定直接 GitHub+cf 就好了。 境内 unicloud 选择阿里云的 纯免费的,基本上对中小项目没啥限制 打开静态网页托管,可以绑定自己的域名。默认就使用阿里的cdn 前端网页部署限制为最大存储空间用量2GB 单文件最大限制为50MB 禁止做图床的,偶尔有几个小图片没事 最终实现方案 为避免滥用,内容删除

2022年 8月 3日 Read all