拯救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那样深刻理解数据库,知道如何用以及如 ...
随机推荐
- LaTeX 插入表格
普通表格 \begin{table}[h] % h: here \begin{center} % 一个字母代表一列 \begin{tabular}{|c|cccc|} % c: center, l: ...
- [golang]查询ssl证书剩余有效天数并邮件提醒
前言 自从云厂商的免费ssl证书改成3个月,而且证书数量还是20个之后,自己网站的ssl证书就换成了其它免费方案.但是免费方案不会提醒证书过期,所以写个工具每天定时查询证书剩余有效天数,如果证书即将过 ...
- C语言三子棋
话说自从大一学C语言后用C语言的巅峰也就是第十二届蓝桥杯了,后续开发什么的都是用的java,搞开发java这样的面向对象语言确实用着更顺手方便点.不过C语言YYDS,"C生万物"嘛 ...
- Argo CD初体验
什么是 Argo CD? Argo CD 是一个声明式的 GitOps 持续交付工具,用于 Kubernetes 集群.它通过持续监控 Git 仓库中的 Kubernetes 资源配置文件,将这些配置 ...
- VS2019 查看源码,使用F12查看源码
前几天在微软社区看到VS的功能演示时,偶然看到此功能,对于开发人员来说太有用了,特此记录分享出来希望可以帮助到家. 具体设置步骤,打开vs2019,在工具>选项>文本编辑器>c#&g ...
- Unocss使用
目录: 安装 简单使用 自定义规则 安装 { "dependencies": { "unocss": "^0.55.6", "vu ...
- Angular 18+ 高级教程 – Reactive Forms
前言 上一篇的 Ajax 和这一篇的表单 (Form) 都是前端最最最常见的需求. 为此,Angular 分别提供了两个小型库来帮助开发者实现这些需求: Ajax – HttpClient Form ...
- 全面掌握 Jest:从零开始的测试指南(上篇)
随着JavaScript在前后端开发中的广泛应用,测试已成为保证代码质量的关键环节. 为什么需要单元测试 在我们的开发过程中,经常需要定义一些算法函数,例如将接口返回的数据转换成UI组件所需的格式.为 ...
- JSON——简介
JSON--简介 JSON--基础语法 JSON--json数据与java对象的转换 // 将java对象转为json字符串 User user = new User(1,&q ...
- Servlet——Tomcat8以前解决中文乱码问题
Request 请求参数中文乱码问题 // 1.解决乱码问题:POST,getReader() request.setCharacterEncoding("UTF-8&quo ...