拯救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那样深刻理解数据库,知道如何用以及如 ...
随机推荐
- 记一次list集合优化
已知某个列表List1有2000条数据,但是因为这个列表的某个字段要从另一个表查询,所以根据一个关联的查询条件查出来的另一个List2有将近75000条数据,然后需要先循环第一个List1,然后循环里 ...
- Linux 内核相关命令
Shell 命令: ipcs # 查看共享内存 dmesg # 显示内核消息 sudo dmesg -c # 清空内核消息 sudo mknod /dev/rwbuf c 60 0 sudo insm ...
- 使用 Gradle 构建包含所有依赖的 JAR 包
在 Gradle 中构建一个包含所有依赖的 jar 包(通常被称为"fat jar"或者"uber jar"),你可以使用 shadowJar 插件来包含编译的 ...
- Honor X20 忽然不能与Android Studio 连接
背景:前一天还正常使用,可以连接Android Studio,第二天就连不上了 已知:数据线没问题,驱动没问题,设备开了开发者模式,连接上电脑时会提示已连接USB调试, 测试过程:(点击撤销USB调试 ...
- docker with GPU support
自己总结的: nvidia-docker, 不支持windows,2019.10, nvidia-docker过时了,从docker 1903开始,安装一个nvidia-container-runti ...
- MMDetection
安装了mmdetection,想跑一下有几篇文章的工作.总觉得发展很快,一转眼几年时间,好多东西都变了.可再仔细看,感觉又没变啥,还是faster rcnn, ssd, yolo等,这几年变化的主要是 ...
- Google Ads – UTM
介绍 UTM (Urchin tracking module) 的作用是帮助我们收集访客的来源渠道. 比如说, 用户是从 Google 广告来的, Youtube, 还是 Facebook 等等. 它 ...
- ASP.NET Core – Logging & Serilog
前言 以前就写过了 Asp.net core 学习笔记 (Logging 日志), 只是有点乱, 这篇作为整理版. 参考: docs – Logging in .NET Core and ASP.NE ...
- springboot起步依赖
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot ...
- 使用iis设置网站php版本为7.3
内容:使用iis设置网站php版本为7.3这张图 是多少人的噩梦 早期的宝塔版本 没办法在线升级, php版本只能到7.1 默认就没有7.2以上版本 怎么办?可以在iis设置第一步: 第二步 ...