Nginx OpenResty PHP

本博客已搭建了访问地址

PHP:http://os.iwonmo.com

OpenResty:http://os.iwonmo.com/openresty

明确几个概念

Ngxin:反向代理(与之相对的是正向代理)

OpenResty:基于Nginx开发的Web平台,也可以理解为它就是Nginx只不过把Nginx增强了

PHP-FPM:PHP的进程管理器

普遍访问流程:用户 -> Ngxin -> PHP-FPM -> 数据 | 数据 -> 用户

OpenResty访问流程:用户 -> OpenResty ->数据 | 数据 -> 用户

可以看到少了PHP-FPM直接就可以把数据给用户,这样就可以去掉PHP的一些弊端。

比如高并发下PHP接受的请求多过PHP-FPM能够管理的进程会堵塞。

造成进程堵塞即使Nginx还有处理请求的能力,也得进行等待,这样Nginx的并发优势就没法体现出来。

普遍的解决方法就会不断的增加负载服务器,实际Nginx单台服务器的并发是很不错的。

但是使用PHP编写的话,就会有一些约束,这个约束来自PHP-FPM模式。

效率对比

第一张图是OpenResty,第二张图是PHP-FPM。可以发现有一个明显的激增,这个有很大概率是PHP堵塞其它请求等待。并发测试并没有太高,所以效果不是很明显,高并发下差异化会放大。

Mysql 语法分析

千条语句大概在11毫秒左右,另外文法星号可以自动提取出来。比如创建数据库语句,定义好文法,可以自动提取出数据库名字。

微信截图_20200305163818.png


源码 支持Mysql注释符解析

function getMysql(j){function q(P){return"[object String]"==Object.prototype.toString.call(P)?P.toLowerCase():P}function w(){""!=B&&z.push(B),B=""}var y=j.replace(/--\s[\s\S]*|--\s[\s\S]*[\r\n|\n]|\/\*(.|[\r\n|\n])*\*\/|#[\s\S]*[\r\n|\n]|#[\s\S]*/i,""),z=[],A=[],B="",C=["'","\"",";"],D=[" ","\r\n","\n","\r"],E=[["create","database","*",[["\u6570\u636E\u5E93\u540D\u79F0"],1]],["use","*",[["\u6570\u636E\u5E93\u540D\u79F0"],2]],["drop","database","*",[["\u6570\u636E\u5E93\u540D\u79F0"],3]]];for(i=0;i<y.length;i++){var F=y.charAt(i);-1===C.indexOf(F)?-1===D.indexOf(F)?B+=F:w():(w(),z.push(F))}for(w(),E.sort(function(P,Q){return Q.length-P.length}),i=0;i<z.length;i++){var G=i;for(k=0;k<E.length;k++)if(z.length-i>=E[k].length-1){var H=E[k].length-1,I=0,J=[];for(n=0;n<E[k].length-1;n++)0==function(P,Q){return"*"==P&&"*"!=Q?0:"*"==P&&"*"==Q?-1:q(P)==q(Q)?0:-1}(E[k][n],z[i])&&(i++,I++),"*"==E[k][n]&&J.push(n);if(I==H){var K="",L=0,M=[];for(m=G;m<i;m++)-1!==J.indexOf(L)&&M.push(z[m]),K=K+z[m]+" ",L++;K=K.substring(0,K.length-1);var N=[E[k][E[k].length-1][1],K,M];A.push(N),i--}else i-=I}}return 0==A.length?j:A}
let res =getMysql("Create database ku1 #DWADWADAWJKHJK\r\n#DWADWADAWJKHJK\n-- DWADWADAWJKHJK Create database ku2");
console.log(res);


微信模板消息群发

在对用户群发消息的时候出现一些问题(发送用的zoujingli的封装):

1、循环发送150条,实际只到30-90之间。

2、用sleep for循环发送又会出现只发送1条或者2条的现象

思考:

1、是否是客户端已经断开 PHP脚本终止执行。

查看PHP的连接处理:https://www.php.net/manual/zh/features.connection-handling.php

  • 0 - NORMAL(正常)

  • 1 - ABORTED(异常退出)

  • 2 - TIMEOUT(超时)

所以有所怀疑是TIMEOUT,解决方法:set_time_limit 设置脚本超时时间

2、设置超时时间还是无效考虑是不是发送的频繁了

由于Sleep函数出现打断问题,所以使用 time_sleep_until 结果又出现了问题:150条发送了160次。有重复的。

3、是不是推送的太频繁微信队列问题

于是使用阿里的队列来进行逐个的推送,首先将用户推送到阿里的队列,然后在一个一个的从阿里的队列上取出来,推送给微信。结果又发现一个阿里的问题,显示的消息数一直在80与96两个数来回切换。而微信已经推送了100多条了。这个不影响功能,当阿里推送完毕我查看了一下阿里的消息数153条。而数据库的判断字段也没有了。也就是说脚本确实多推送了一些。怀疑是睡眠问题,于是将睡眠代码去掉,然后将脚本时间设置为0。

屏幕快照 2020-02-23 下午10.20.54.png

这次推送到阿里很准确,只有150条,原先推了153条。但是有个问题,微信的推送走的很慢,很长时间才会走一个推送。不过起码比没有强。准确度还有待检测。因为确实太慢了,就不等了,明天直接一个微信工单吧。

解决方法:

阅读全文»

LayUi Tree

tree.js.zip

源码版本:2.5.4 官方文档

增加了两个方法:setAllChecked、unChecked

setAllChecked("唯一实例ID",true|false) //设置全选|不全选

unChecked 与 setChecked 一样

对某软件的编译分析

在Window上对它进行了行为分析。发现编译的时候主要是进行了3个操作。

1、检测配置文件语法

2、检测页面配置语法

3、执行代码编译脚本

测试发现前面2条可以省略,究其原因是因为它也是使用的第三方插件实现的检测,不是它的编译主要逻辑,所以需求上可以去掉。主要是执行代码编译脚本。

发现脚本后直接执行了一下,发现报错。原因是没有对进程信息进行填充。所以手动填充了一下,这里没有看出来它是怎么进行进程填充的,后续有时间再分析吧(注1)。修改编译脚本测试结果如下。

1、直接运行

WechatIMG33.png

2、编译压缩

WechatIMG44.png

未完待续:关注微信小程序获取访问密码 (文章ID:1700)或小程序在线阅读