拯救php性能的神器webman-初入门

无意间发现的这个神器webman,真是秋名山上的腾源拓海!

该框架是workerman下的一个web开发的生态,我们可以先看看这里workerman的官方网站

workerman早有耳闻,知道它蛮厉害的,跟swoole也不相上下,这次主要是说webman,可以看这里 

话不多说,赶紧上手。

1. 安装

这个安装真的很简单,就一句话  composer create-project workerman/webman 就是它要求你的PHP版本和composer版本

很好,我们直接就跑起来

2. 修改服务端口配置

然后就进去  cd webman ,vscode打开这个文件夹, code . 

找到  config/server.php  改一下默认的IP:端口。这里我就把原来的  0.0.0.0  改为了 127.0.0.1  端口继续用  8787 

 然后就在命令行上面执行  php start.php start 把服务运行起来

好了,服务已经起来了。现在实际上就是 php在监听  127.0.0.1  的  8787  端口

3. 分析入口代码

我们看一下代码

显然这里的controller是app下面的这个默认的  IndexController.php  文件控制器,好,我们打开这个文件可以看到默认方法

就是说首页实际上是读取了 README.md 文件来的,这样,我们去访问一下首页的 http://127.0.0.1:8787/ 看一下结果,我们得到了这个

 好的,然后我们尝试着直接改一下这个文件看看。

我们改为这个样子看看

 然后再刷新首页

我们可以看到,这里结果直接就变化了,这说明我们的代码是立即生效的。这个和swoole还是稍微有点不同的,那个要重新启动一下服务(不过我记得应该也有插件还是什么来着能够让代码立即更新的,但是要另外设置一下)

这里我们可以将这个更新称为热更新,就是服务还在运行,但是服务提供的代码变了。

4. 分析静态变量作缓存

这里我注意到有个 static 关键字,感觉这个东西不得了啊,我就大胆的按照我预想的去尝试了一下。

我将if判断里面加一个小小的调试。

好了代码改好了,我们Ctrl+C把服务停掉,再执行一下把服务开起来  。

就像上图我的操作一样,我第一次点击刷新进行访问,命令行输出了这句话 Will you only see me once time?

但是我后面的刷新访问,再也没有这样的话输出了,这说明了什么?

这说明这个变量是在命令行里面的静态变量,就意味着,他只会在if里面赋值一次,那也就是说,如果某些数据是从库里面拿到的而且不经常变化,我们完全可以拿这个静态变量进行存储,当作内存缓存在用,它比 file_get_contents 这样的文件缓存还快。

因为在以往php以 fastcgi或者FPM模式运行的场景下,请求与请求之间是独立的,总是有服务器进行转发或者解析的,那么这个时候两个请求之间是不能共用变量的,除非是那种 $_SERVER $_SESSION 等变量,但是这种东西显然不合适用来存储缓存数据的。所以我们一般会用 file 文件缓存serialize或者json_encode好数据,然后读取的时候读文件再反序列化来给后面的请求用,又或者我们觉得文件读写太慢更高级的 memcache redis缓存,但是即便是用这种内存服务器缓存,它也有开销需要连接内存服务器,更激进一些我们用本地的Apc Yac缓存,可是这种东西我之前测试发现它有一个容量上面的限制,不是很方便给这种很大变量的缓存用。而这个时候我们能看到这个webman直接将静态变量就能复用给不同的请求,实在是太快太方便了,等于后面的请求在index方法里面就走了两行代码就直接return了,真的牛!

先别高兴太早,仔细思考了一下,我觉得这样也是有点风险的,如果开发人员塞进来一个大数组或大的变量,或者说开始写代码的时候数据量少,从数据库读出来就这样赋值了,后来随着数据量的猛增,这个内容越来越大,这样命令行这里占用的内存也将越来越大,我猜测这里的变量是不释放的,直接是给下一个请求在用,我不知道这个框架它有没有那种自动回收变量内存的机制,如果没有,那这里还真可能是个安全隐患。

所以,这对于我们开发而言,就必须要更谨慎小心的使用这个功能,虽然它真的很快很好用。

好了关于这里的静态变量缓存我们先探讨到这里,然后我们看看另外两个方法。

5. 首页另外两个方法

这里看看另外两个方法,一个是 view , 一个是 json

view的就很简单,代码如下

就是渲染了模板,然后赋值name变量,简单猜测一下 肯定是在什么 view 文件夹里面的 index 文件夹 里面的 view.html 之类的

然后去看了看果然

 好了,这里很简单,就是把 name 变量输出来,看看访问效果

咦?怎么会这样,这里不通?又想了想,哦,原来是 1234678,年轻人不讲5的(武德) 啊!

重新按照这个访问  http://127.0.0.1:8787/index/view 

 好了,有了。

然后再看看另外一个 json 的,代码如下:

 吸取教训,这样访问  http://127.0.0.1:8787/index/json 

 得到了序列化json,可能你会奇怪为什么你的浏览器访问的效果不是这样的,你可能得到的是这样的

哈哈,那是因为我给我的chrome浏览器安装了一个插件,叫  JSON-handle

你可以在 chrome 的插件市场里面搜索JSON找到它

当然了,很有可能你都打不开这个网站。(你看看这站点域名就知道了)

6. 请求压力测试

好了,现在该给它上点强度了。我下载了一个软件叫 ddosify 。你可以这样安装它  sudo apt install ddosify 

然后在命令行里面 对刚刚的这个站点来测试一下。

先执行这个,给它来个 5000 个请求

ddosify -t http://127.0.0.1:8787/index/json -d 1 -n 5000

用 ddosify 给这个URL   http://127.0.0.1:8787/index/json 进行请求(-t参数设置),持续1秒(-d参数设置),发起请求 5000次(-n参数设置)

看样子感觉良好嘛,平均时间是 0.00187s 也就是 1.87 毫秒,不过毕竟这代码啥也没干就返回了json。

再加大强度!上2万个请求!

好家伙,真是人才啊!这都顶住了,成功率百分百,而且花费时间反而短了,只用了 0.36 毫秒,都不知道说啥好了。 

再加大力度! 上5万个请求!

总算出现失败了吧。看样子还是慢厉害的,都顶住了这么多请求,这在原来nginx或者apache的那种场景下,不知道会怎么样。

没有数据是没法说话的,我们试试看。现将代码修改成一样。

先看看apache2 启动!  sudo systemctl start apache2 再次测试 

果然5000就顶不住了

 后续我又测试了一下,2000也没顶住啊,不过也有可能是我的apache2没有调优导致的。

好,再看看 nginx。

好样的 nginx! 顶住了第一波 5000 个请求

再上点强度!2万个请求试试看。

 再加大强度!5万个请求试试看。

看来大家都是在5万个请求这里顶不住了。好的,你们已经尽力了,辛苦同志们了!

从单纯的返回json数据的请求测试结果来看,这个框架还是厉害的,也能和nginx有一定程度上的媲美,我也感觉到了webman真是秋名山上的AE86啊!

感觉有了这个框架,就像给拓海的AE86换上了4A-GEU发动机,让他不再受制于马力的大小限制,真正狂飙起来!

posted @ 2024-03-01 10:58  李照耀  阅读(2433)  评论(0编辑  收藏  举报