有了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-数据库的更多相关文章

  1. 阿里巴巴开源性能监控神器Arthas初体验

    如果问性能测试中最难的是哪部分,相信很多人会说“性能调优”.确实是这样,性能调优是一个非常复杂.技术含量很高的工作.涉及到的知识面很广.以我多年从业经验来看,在企业里,大多数的性能调优都是由开发架构师 ...

  2. 阿里巴巴开源性能监控神器Arthas jvm

    原文:https://www.cnblogs.com/testfan2019/p/11038791.html 如果问性能测试中最难的是哪部分,相信很多人会说“性能调优”.确实是这样,性能调优是一个非常 ...

  3. SQL索引一步到位(此文章为“数据库性能优化二:数据库表优化”附属文章之一)

    SQL索引一步到位(此文章为“数据库性能优化二:数据库表优化”附属文章之一) SQL索引在数据库优化中占有一个非常大的比例, 一个好的索引的设计,可以让你的效率提高几十甚至几百倍,在这里将带你一步步揭 ...

  4. 【性能提升神器】STRAIGHT_JOIN

    今天给大家下另一个性能提升神器-STRAIGHT_JOIN,在数据量大的联表查询中灵活运用的话,能大大缩短查询时间. 首先来解释下STRAIGHT_JOIN到底是用做什么的: STRAIGHT_JOI ...

  5. MySQL性能优化神器Explain

    本文涉及:MySQL性能优化神器Explain的使用 简介 虽然使用Explain不能够马上调优我们的SQL,它也不能给予我们一些调整建议,但是它能够让我们了解MySQL 优化器是如何执行SQL 语句 ...

  6. 【SQL server初级】数据库性能优化二:数据库表优化

    数据库优化包含以下三部分,数据库自身的优化,数据库表优化,程序操作优化.此文为第二部分 数据库性能优化二:数据库表优化 优化①:设计规范化表,消除数据冗余 数据库范式是确保数据库结构合理,满足各种查询 ...

  7. 【SQL server初级】数据库性能优化一:数据库自身优化(大数据量)

    数据库优化包含以下三部分,数据库自身的优化,数据库表优化,程序操作优化.此文为第一部分 数据库性能优化一:数据库自身优化 优化①:增加次数据文件,设置文件自动增长(粗略数据分区) 1.1:增加次数据文 ...

  8. Java性能分析神器--VisualVM Launcher[1]

    Java性能分析神器1--VisualVM Launcher VisualVM 当你日复一日敲代码的时候,当你把各种各样的框架集成到一起的时候,看着大功告成成功运行的日志,有没有那么一丝丝迷茫和惆怅: ...

  9. 性能分析神器VisualVM【转】

    性能分析神器VisualVM[转] Posted on 2015-04-17 09:37 WadeXu 阅读(5809) 评论(6) 编辑 收藏 VisualVM 是一款免费的,集成了多个 JDK 命 ...

  10. 【性能提升神器】Covering Indexes

    可能有小伙伴会问,Covering Indexes到底是什么神器呢?它又是如何来提升性能的呢?接下来我会用最通俗易懂的语言来进行介绍,毕竟不是每个程序猿都要像DBA那样深刻理解数据库,知道如何用以及如 ...

随机推荐

  1. P10884 [COCI 2017-2018#2] San

    题目传送门:P10884 [COCI 2017-2018#2] San 看下标签 COCI(克罗地亚) 2017 啊 比我小4年的题 --------------------------------- ...

  2. .NET 6 使用Nlog 记录日志到本地并写入SQLserver数据库

    1. 安装Nlog 对应Nuget包版本 NLog:5.0.4 NLog.Database:5.0.4 NLog.Web.AspNetCore:5.1.4 Microsoft.Data.SqlClie ...

  3. VMware Workstation Pro 开启虚拟化引擎

    摘要:想开启 VMware Workstation Pro 虚拟机上的 虚拟化 Intel VT-x/EPT 或 AMD-V/RVI 选项,却发现打不开.在网上一番搜集之后找到了解决办法. ️ 注意: ...

  4. ChatGPT学习之旅 (10) 系统全球化小助手

    大家好,我是Edison. 上一篇我们写了一个运维小助手的prompt,它帮我们写一些我们开发者不太愿意做的一些运维小任务.这一篇,给大家分享下我在日常的系统开发中遇到的多语言/全球化的任务中是如何通 ...

  5. Java 实现线程的方式有几种方式?带有返回值的线程怎么实现?

    Java 实现线程的方式有几种方式?带有返回值的线程怎么实现? 在Java线程开发中,有几种方法开启线程?假如需要得到线程返回的信息怎么办?可以实现吗?凯哥将通过源码和大家一起分享下线程怎么将返回值带 ...

  6. hook拼多多客服软件发消息,拼多多客服机器人代码,拼多多发消息代码

    最近由于工作需要,逆向了拼多多客服平台,能调用消息监听.消息发送.根据订单号发起会话,是纯hook实现的,demo包括c++调用demo,c#调用demo.hook 的dll是c++编写的,有需要的人 ...

  7. JavaScript Library – YouTube Embedded、YouTube Player API、YouTube Data API

    YouTube Embed Video 参考: Embed videos & playlists 它和 Google Maps Embed 类似,是通过 iframe 完成的. <ifr ...

  8. Hugging Face NLP课程学习记录 - 0. 安装transformers库 & 1. Transformer 模型

    Hugging Face NLP课程学习记录 - 0. 安装transformers库 & 1. Transformer 模型 说明: 首次发表日期:2024-09-14 官网: https: ...

  9. JavaScript —— 简介-引入方式

    什么是JavaScript?    JavaScript的引入方式:      

  10. 【赵渝强老师】Redis案例分析:用setbit统计活跃用户

    一.需求背景 首先,我们来看一下需求:网站统计用户登录的次数,具体如下: 网站有1亿个用户,有经常登录的,也有不经常登录的 如何来记录用户的登录信息 如何查询活跃用户:比如:一周内,登录3次的 二.使 ...