拯救php性能的神器webman-初入门
无意间发现的这个神器webman,真是秋名山上的腾源拓海!
该框架是workerman下的一个web开发的生态,我们可以先看看这里workerman的官方网站。
workerman早有耳闻,知道它蛮厉害的,跟swoole也不相上下,这次主要是说webman,可以看这里
话不多说,赶紧上手。
1. 安装
这个安装真的很简单,就一句话 composer create-project workerman/webman 就是它要求你的PHP版本和composer版本
- PHP >= 7.2
- Composer >= 2.0
很好,我们直接就跑起来
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发动机,让他不再受制于马力的大小限制,真正狂飙起来!
拯救php性能的神器webman-初入门的更多相关文章
- 阿里巴巴开源性能监控神器Arthas初体验
如果问性能测试中最难的是哪部分,相信很多人会说“性能调优”.确实是这样,性能调优是一个非常复杂.技术含量很高的工作.涉及到的知识面很广.以我多年从业经验来看,在企业里,大多数的性能调优都是由开发架构师 ...
- 【性能提升神器】STRAIGHT_JOIN
今天给大家下另一个性能提升神器-STRAIGHT_JOIN,在数据量大的联表查询中灵活运用的话,能大大缩短查询时间. 首先来解释下STRAIGHT_JOIN到底是用做什么的: STRAIGHT_JOI ...
- MySQL性能优化神器Explain
本文涉及:MySQL性能优化神器Explain的使用 简介 虽然使用Explain不能够马上调优我们的SQL,它也不能给予我们一些调整建议,但是它能够让我们了解MySQL 优化器是如何执行SQL 语句 ...
- Java性能分析神器--VisualVM Launcher[1]
Java性能分析神器1--VisualVM Launcher VisualVM 当你日复一日敲代码的时候,当你把各种各样的框架集成到一起的时候,看着大功告成成功运行的日志,有没有那么一丝丝迷茫和惆怅: ...
- 阿里巴巴开源性能监控神器Arthas jvm
原文:https://www.cnblogs.com/testfan2019/p/11038791.html 如果问性能测试中最难的是哪部分,相信很多人会说“性能调优”.确实是这样,性能调优是一个非常 ...
- SpringBoot 初入门
SpringBoot 初入门 关于介绍什么之类的就不讲了,主要做一下学习记录. 1. 启动方式 IDEA 启动 命令行启动: mvn spring-boot:run 部署到服务器启动: 先进行打包, ...
- 性能分析神器VisualVM【转】
性能分析神器VisualVM[转] Posted on 2015-04-17 09:37 WadeXu 阅读(5809) 评论(6) 编辑 收藏 VisualVM 是一款免费的,集成了多个 JDK 命 ...
- 任务队列神器:Celery 入门到进阶指南
任务队列神器:Celery 入门到进阶指南 发布于2021-03-24 16:24:53阅读 1.9K0 1.什么是celery celery是一个简单,灵活.可靠的分布式任务执行框架,可以支持大 ...
- 【性能提升神器】Covering Indexes
可能有小伙伴会问,Covering Indexes到底是什么神器呢?它又是如何来提升性能的呢?接下来我会用最通俗易懂的语言来进行介绍,毕竟不是每个程序猿都要像DBA那样深刻理解数据库,知道如何用以及如 ...
- Java性能分析神器-JProfiler详解(一)(转)
前段时间在给公司项目做性能分析,从简单的分析Log(GC log, postgrep log, hibernate statitistic),到通过AOP搜集软件运行数据,再到PET测试,感觉时间花了 ...
随机推荐
- 【Mac】之安装VM虚拟机并安装centos7系统
参考文章:<Mac 安装VMware Fusion虚拟机> 一.安装VMware Fusion 首先下载Mac版VMware虚拟机: 链接:https://pan.baidu.com/s/ ...
- JSP的文件上传和下载
文件的上传和下载 文件的上传和下载,是非常常见的功能.很多的系统中,或者软件中都经常使用文件的上传和下载. 比如:微信头像,就使用了上传. 邮箱中也有附件的上传和下载功能. 文件的上传介绍 1.要有一 ...
- DPABInet做 Network Contruction时一直报错“函数或变量 'nets_netmats' 无法识别”
DPABInet模块做 Network Contruction时一直显示报错"函数或变量 'nets_netmats' 无法识别",是因为没有将FSLNets导入路径,所以找不到该 ...
- 数据库中查询含有某个emoji表情的行数据
数据库中查询含有某个emoji表情的行数据 MySQL的情况 代码如下 create table tt6(id int, name varchar(800)); insert into tt6 s ...
- 生产级Redis 高并发分布式锁实战1:高并发分布式锁如何实现
高并发场景:秒杀商品. 秒杀一般出现在商城的促销活动中,指定了一定数量(比如:1000个)的商品(比如:手机),以极低的价格(比如:0.1元),让大量用户参与活动,但只有极少数用户能够购买成功. 示例 ...
- 微信小程序--云开发支付闭环
云开发支付流程闭环 extends 微信小程序--使用云开发完成支付闭环 在上述文章中,我们对支付结果的处理更多依赖于小程序端的操作 订单号存储在小程序端 支付结果采用小程序端定时触发器轮询 现在我对 ...
- QT硬件异构计算
QT硬件异构计算 使用AI技术辅助生成 1 QT硬件异构计算概述 1.1 硬件异构计算概念 1.1.1 硬件异构计算概念 硬件异构计算概念 <QT硬件异构计算>正文 硬件异构计算概念 在进 ...
- 【赵渝强老师】Oracle数据库的存储结构
Oracle的存储结构分为:物理存储结构和逻辑存储结构. 一.物理存储结构:指硬盘上存在的文件 数据文件(data file) 一个数据库可以由多个数据文件组成的,数据文件是真正存放数据库数据的.一个 ...
- for 和双重 for 的区别?
1. 内层的循环可以看作外层循环的语句 2. 外层循环执行 1 次 ,内层循环执行全部
- jQuery的$(document).ready(function(){}) 和 原生 js 的load 等待加载事件有什么不同
jQuery 的 $(function (){}) 函数入口需要等待 DOM 结构绘制完成才会执行 , 不用等待外部资源加载完毕 和原生js 的 DOMContentLoaded 类似 , 2 者 ...