首页 > 编程语言 >拯救php性能的神器webman-初入门

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

时间:2024-03-01 11:15:24浏览次数:25  
标签:缓存 请求 webman 神器 json php 变量

无意间发现的这个神器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发动机,让他不再受制于马力的大小限制,真正狂飙起来!

标签:缓存,请求,webman,神器,json,php,变量
From: https://www.cnblogs.com/lizhaoyao/p/18046309

相关文章

  • 最新版商家采集软件,支持地区采集,一键导出【精准客户采集神器】
    要将高德(或腾讯、百度)地图上的号码导出到通讯录,可以按照以下步骤操作:工具:微拓客APP工具二:手机操作:手机上应用商城搜索微拓客,下载安装。微拓客下载地址https://a.app.qq.com/o/simple.jsp?pkgname=com.lieluyun.tuoke关键词客源:关键词客源按地区和行业采集地图上商家、企业信......
  • php 对接vivo 用户行为数据上传接口
    vivo文档:https://open-ad.vivo.com.cn/doc/index?id=217publicfunctionvivo(){$accessToken=$this->request->param('accessToken');$srcId=$this->request->param('srcId');$cvType=$this->request-......
  • php 生成小程序二维码
    publicfunctiongenerate($code,$isShow){//构建二维码参数$scene='C='.$code.'&path=green';$params=["scene"=>$scene,'page'=>'pages/log......
  • php生成树状层级子孙树
    关于简单的方式获取树状层级子孙树的方案我已经写过了,在这里,当时是用简单的递归实现的,但是现在回头想想,如果层级很多,数据也很多,用递归感觉还是会不稳妥,这就有必要想办法转换为迭代来实现了。以下是迭代的代码实现<?php$data=[['id'=>1,'name'=>'中国','pid'=>0......
  • [安洵杯 2019]easy_serialize_php
    [安洵杯2019]easy_serialize_php<?php$function=@$_GET['f'];functionfilter($img){$filter_arr=array('php','flag','php5','php4','fl1g');$filter='/'.implode('|�......
  • CTFHUB-web-信息泄露-PHPINFO
    开启题目访问只有这一个页面,看一下flag在没在页面里信息发现:https://www.cnblogs.com/Cl0ud/p/15999347.html系统版本信息配置文件位置allow_url_fopen&allow_url_include文件包含必看选项之一,如果allow_url_fopen和allow_url_include都为On的时候,则文件包含函数......
  • 设置PHP最大连接数及php-fpm -static高并发
    设置PHP最大连接数及php-fpm高并发参数调整 服务器中找到php-fpm.conf配置(有的会在引入的www.conf中)1234567891011121314151617181920212223[global]pid=/usr/local/php/var/run/php-fpm.piderror_log=/usr/local/php/var/log/ph......
  • Thinkphp
    官网https://www.thinkphp.cn/docComposerComposer是PHP的一个依赖管理工具,它允许你声明项目所需的库依赖,并且会为你安装它们。在许多方面,它与其他编程语言中的包管理工具类似,例如Node.js的npm或者Python的pip。使用Composer可以使PHP开发变得更加高效、组织化,并......
  • mitmproxy 抓包神器-6.如何在linux操作系统中安装
    前言常见的抓包工具有fiddler和charles,这些工具都是需要安装本地客户端,python版的抓包工具可以用mitmproxy。mitmproxy相比Charles、fiddler的优点在于,它可以命令行方式或脚本的方式启动服务,跨平台使用。Linux环境安装mitmproxy(man-in-the-middleattackproxy),中间人......
  • GraphPad Prism 10: 你的数据,我们的魔法 mac/win版
    GraphPadPrism10是GraphPadSoftware公司推出的一款功能强大的数据分析和可视化软件。它集数据整理、统计分析、图表制作和报告生成于一体,为科研工作者、学者和数据分析师提供了一个高效、便捷的工作平台。→→↓↓载GraphPadPrism10mac/win版Prism10拥有丰富的图表类型,......