拯救php性能的神器webman-数据库
有了webman的这个框架,我们得看看它是怎么使用数据库的,毕竟我们不能一直用内存变量啊。
好,很简单一句话跑起来。
composer require -W illuminate/database illuminate/pagination illuminate/events symfony/var-dumper
官方对于这里数据库的解释是: webman数据库默认采用的是 illuminate/database,也就是laravel的数据库,用法与laravel相同。
当然你可以参考使用其它数据库组件章节使用ThinkPHP或者其它数据库。
执行结果

这上面的命令执行了一大堆东西,如果不需要分页、数据库事件、打印SQL,则只需要执行
composer require -W illuminate/database
好,这里我们就按最完整的来,安装一大堆东西,看看该怎么用。
1. 配置数据库链接信息
先配置一下数据库信息,在 config/database.php 里面看看代码
它默认是这样的

我们先到数据库里面去建立一个库 create database webman charset utf8mb4;
然后创建一个users表
CREATE TABLE `users` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`username` char(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '用户名',
`password` char(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '密码',
`mobile` char(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '手机',
`status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '0禁用/1启动',
`last_login_time` int unsigned NOT NULL DEFAULT '0' COMMENT '上次登录时间',
`last_login_ip` char(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '上次登录IP',
`login_count` int NOT NULL DEFAULT '0' COMMENT '登录次数',
`create_time` int unsigned NOT NULL DEFAULT '0' COMMENT '创建时间',
`update_time` int unsigned NOT NULL DEFAULT '0' COMMENT '更新时间',
PRIMARY KEY (`id`),
KEY `usermame_idx` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC COMMENT='会员表';
最后搞个100万数据进去
然后就是这样的

好了,数据库有了,表也有了,然后配置这边就需要改一下。
我这数据库密码也是root,你自己的要改一下

然后就尝试着写点代码,连接一下数据库。
2. 连接数据库并发送查询
在IndexController.php 文件同级目录下新建一个UsersController.php
代码如下:
<?php namespace app\controller; use support\Request;
use support\Db; class UsersController
{
public function index(Request $request)
{
$default_id = 29;
$uid = $request->get('id', $default_id);
$name = Db::table('users')->where('id', $uid)->value('username');
return response("hello $name");
} }
然后把服务开起来。

好,现在访问 http://127.0.0.1:8787/users/index 得到结果

好了,现在对比一下跟我们数据库中的是不是一样的。

可以看到确实一样。
3. 根据参数动态查询
随便改改参数,访问发现 http://127.0.0.1:8787/users/index?id=527

数据变了,说明用到了我们传递的参数527,看看数据库里面的是不是一样。

果然一样。好的,那么我们就完成了最简单的一个数据查询。
4. 新增
新增就比较简单,实际上这些ORM的语法基本上都类似
Db::table('users')->insert(
['username' => '姓名', 'password' => '密码']
);
新增多条
Db::table('users')->insert([
['username' => '姓名2', 'password' => '密码1'],
['username' => '姓名1', 'password' => '密码2']
]);
这里我们就不再举例了,实在是太简单了,就像小学暑假作业后面的答案略一样。唯一注意一点返回自增id 可以用 insertGetId
Db::table('users')->insertGetId(
['username' => '姓名', 'password' => '密码']
);
5. 修改
修改的语法也差不多
$affected = Db::table('users')->where('id', 1)->update(['status' => 1]);
根据某些条件,更新某些字段,ORM基本通用都这样写。
有个亮点就是它实现了一个新增或者修改
Db::table('users')->updateOrInsert(
['username' => '用户名'],
['status' => '0']
);
updateOrInsert 方法将首先尝试使用第一个参数的键和值对来查找匹配的数据库记录。 如果记录存在,则使用第二个参数中的值去更新记录。 如果找不到记录,将插入一个新记录,新记录的数据是两个数组的集合。
6. 删除
删除的ORM就很简单
Db::table('users')->where('id', '=', 100)->delete();
你要是想清空表的话,就用 truncate。这么写
Db::table('users')->truncate();
5.请求压力测试
好,我们现在根据这种简单的查询来尝试给它上点强度,
首先把代码改为这样,让它每次都动态的随机获取一条数据,避免数据库层面的缓存。

然后还是用我们的 ddosify 来发起请求。
老规矩,先来5000个。

不错,再来点强度!来2万个请求!

好了出现了一点点问题,1个请求是400,再上更大的强度!来5万个请求!

可以看到这个问题感觉明显了,可以看到这里的提示是 socket: too many open files
感觉这个需要查一下是怎么回事,于是我就去搜索了一下,发现这里说的files实际上不是指文件而是指句柄,我们链接的数据库也算句柄。查到的说法也是让我们改一下这里的限制,感觉大家写的都不太深入,没有讲清楚到底为什么会出现这个问题。
那么我们就按最终的解决方法配置一下看看。
先用 ulimit -a 看一下结果

我注意到了这一行 Maximum number of open file descriptors (-n) 1024
说明只让我打开1024个,那我就改一下
操作如下:

我先用 ulimit -n 设置最大能打开 65535 个句柄,再用 ulimit -a 看一下配置。当然我这里是临时在命令行里面修改,只会临时生效,如果你想永久生效,要改这里的文件 /etc/security/limits.conf
加两行
* soft nofile 65535
* hard nofile 65535
之后我们再发起5万个请求看看效果:

好,你看看,5万个请求扛住了,再往上看看呢?它的极限在哪儿呢?
直接怼到10万请求!好家伙,站起来蹬是吧?

一看,嗯,遇到了点问题,出现了1个400的请求。
感觉这样测好像不是很合理,我想了想,还是换成持续5秒请求,共发起50万个,再试试看

总体来讲还是不错的,虽然出现了这样几十个错误。
好,现在我们想办法将这个数据用缓存来加载。
代码如下:

再次请求,5秒内持续50万个请求看看:

ok,效果不错,看来还是静态缓存能扛事儿啊!
好了,关于数据库的我们就讲到这里,这实在是没什么很深入的东西可说的,毕竟这是大家都通用的ORM,当然了现在这种模式运行下,这里的数据库能扛的并发更高一些了,不过这不是代码上面的问题,是运行模式机制带来的效果。
拯救php性能的神器webman-数据库的更多相关文章
- 阿里巴巴开源性能监控神器Arthas初体验
如果问性能测试中最难的是哪部分,相信很多人会说“性能调优”.确实是这样,性能调优是一个非常复杂.技术含量很高的工作.涉及到的知识面很广.以我多年从业经验来看,在企业里,大多数的性能调优都是由开发架构师 ...
- 阿里巴巴开源性能监控神器Arthas jvm
原文:https://www.cnblogs.com/testfan2019/p/11038791.html 如果问性能测试中最难的是哪部分,相信很多人会说“性能调优”.确实是这样,性能调优是一个非常 ...
- SQL索引一步到位(此文章为“数据库性能优化二:数据库表优化”附属文章之一)
SQL索引一步到位(此文章为“数据库性能优化二:数据库表优化”附属文章之一) SQL索引在数据库优化中占有一个非常大的比例, 一个好的索引的设计,可以让你的效率提高几十甚至几百倍,在这里将带你一步步揭 ...
- 【性能提升神器】STRAIGHT_JOIN
今天给大家下另一个性能提升神器-STRAIGHT_JOIN,在数据量大的联表查询中灵活运用的话,能大大缩短查询时间. 首先来解释下STRAIGHT_JOIN到底是用做什么的: STRAIGHT_JOI ...
- MySQL性能优化神器Explain
本文涉及:MySQL性能优化神器Explain的使用 简介 虽然使用Explain不能够马上调优我们的SQL,它也不能给予我们一些调整建议,但是它能够让我们了解MySQL 优化器是如何执行SQL 语句 ...
- 【SQL server初级】数据库性能优化二:数据库表优化
数据库优化包含以下三部分,数据库自身的优化,数据库表优化,程序操作优化.此文为第二部分 数据库性能优化二:数据库表优化 优化①:设计规范化表,消除数据冗余 数据库范式是确保数据库结构合理,满足各种查询 ...
- 【SQL server初级】数据库性能优化一:数据库自身优化(大数据量)
数据库优化包含以下三部分,数据库自身的优化,数据库表优化,程序操作优化.此文为第一部分 数据库性能优化一:数据库自身优化 优化①:增加次数据文件,设置文件自动增长(粗略数据分区) 1.1:增加次数据文 ...
- Java性能分析神器--VisualVM Launcher[1]
Java性能分析神器1--VisualVM Launcher VisualVM 当你日复一日敲代码的时候,当你把各种各样的框架集成到一起的时候,看着大功告成成功运行的日志,有没有那么一丝丝迷茫和惆怅: ...
- 性能分析神器VisualVM【转】
性能分析神器VisualVM[转] Posted on 2015-04-17 09:37 WadeXu 阅读(5809) 评论(6) 编辑 收藏 VisualVM 是一款免费的,集成了多个 JDK 命 ...
- 【性能提升神器】Covering Indexes
可能有小伙伴会问,Covering Indexes到底是什么神器呢?它又是如何来提升性能的呢?接下来我会用最通俗易懂的语言来进行介绍,毕竟不是每个程序猿都要像DBA那样深刻理解数据库,知道如何用以及如 ...
随机推荐
- .NET Core3.1 跨域 Cors 找不到 “Access-Control-Allow-Origin”
今天在做项目的时候遇到了调用WebAPI跨域的问题 No 'Access-Control-Allow-Origin' header is present on the requested resour ...
- VMware 安装 OpenWrt
准备 OpenWrt VMDK 固件映像 你可以直接下载 VMDK 版本的 OpenWrt 固件映像,或者自己构建一个,或者从 IMG 映像文件转换.一般来说 IMG 映像文件较为容易获取,因此下面介 ...
- macOS 扫描局域网设备
arp-scan: arp-scan 是一个直接用于扫描本地网络中的设备的 UNIX 工具.这不是 macOS 自带的,但可以使用 Homebrew 安装.首先安装 Homebrew(如果尚未安装), ...
- c++学习笔记(二):引用
c++中的引用 引用变量是一个别名,也就是说,它是某个已存在变量的另一个名字.一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量. C++ 引用 vs 指针 引用很容易与指针混淆,它 ...
- 《SpringCloud微服务之间相互调用》之Feign实战
一.场景再现 假设我们有这样一个场景: 用户付款成功后,扣除用户金额,还要减少仓库数量.按照微服务的设计理念,用户具有至少以下3个服务(项目): 1.订单 2.账户 3.仓库 微服务之间都是相互独立的 ...
- 物体检测序列之一:ap, map
准确率(Precision),也叫正确预测率(positive predictive value),在模式识别.信息检索.机器学习等研究应用领域,准确率用来衡量模型预测的结果中相关或者正确的比例.而召 ...
- ASP.NET Core – Data Protection & Azure Storage + Azure Key Vault
前言 以前就写过很多篇了 Asp.net core 学习笔记 ( Data protection ) Asp.net core 学习笔记 Secret 和 Data Protect Azure key ...
- CSS – 管理
前言 CSS 有好几种写法. 它们最终出来的效果是一样的, 区别只是在你如何 "写" 和 "读" 或者说开发和维护. 这已经不是如何"实现" ...
- CSS – 实战 Spacing & Layout
前言 这篇想整理一下在网页开发中, Spacing (间距) 和 Layout 排版是如果被处理的. Spacing 介绍 东西密密麻麻会给人一种很恐怖的感觉. 只要加上一点空间 (间距), 整体感觉 ...
- Linux 防火墙与安全管理工具详解
Linux 防火墙与安全管理工具详解 1. Iptables 概述 Iptables 是 Linux 系统中用于控制网络流量的工具,通过定义规则来过滤.转发和修改数据包.其规则可以细致地管理进入和离开 ...