搭建一个基于swoole的http框架来跑跑curd用作性能测试
搭建一个基于 swoole 的 http 框架来跑跑 curd 用作性能测试#
目录结构#
├── README.md
├── bin
│ ├── Client.php
│ ├── Command.php
│ ├── HttpServer.php
│ ├── Log.php
│ ├── Route.php
│ ├── ServerQueue.php
│ ├── controller
│ │ ├── Controller.php
│ │ ├── IndexController.php
│ │ └── Response.php
│ ├── exception
│ │ └── HttpException.php
│ ├── pool
│ │ ├── DB.php
│ │ ├── DbPool.php
│ │ ├── Mysql.php
│ │ ├── Mysqli.php
│ │ ├── PDO.php
│ │ └── RedisPool.php
│ ├── queue
│ │ └── Queue.php
│ ├── static
│ │ └── favicon.ico
│ └── utility
├── composer.json
├── composer.lock
├── config
│ ├── database.php
│ ├── email.php
│ ├── log.php
│ ├── route.php
│ └── server.php
├── docs
├── helpers.php
├── http.php
├── tcp.php
├── test
├── test.php
└── view
├── 404.html ├── echarts.html └── log_list.html```
简单的测试功能#
- 使用大量单例 避免使用
static
属性 PHP 全局变量产生内存泄漏问题 - 支持简单的路由分发 \ 控制 简洁的控制器
- 支持 mysql 连接池 实现了 curd 以及事务操作
要求#
- php 版本 >=7.3
- swoole4
安装使用测试#
get clone https://github.com/pl1998/swoole_http.git
php http.php
全局辅助函数文件
helpers.php 通过
composer.json文件 中
autoload` 实现了自动加载
- 主要实现一些全局函数 读取视图函数 view () 读取配置函数 config ()
"autoload": {
"psr-4": {
"app\\": "bin" //主目录自动加载 映射命名空间
},
"files": [ "helpers.php" ]
}
新增测试配置文件#
├── config
│ ├── database.php //数据库配置
│ ├── route.php //路由文件
│ └── server.php //tcp http 配置以及端口
新增测试路由 router.php
#
/**
* 路由配置 */
return [
'GET' => [
'/favicon.ico'=>false,
'/'=>[\app\controller\IndexController::init(),'index'],
'/api/create'=>[\app\controller\IndexController::init(),'create'],
'/api/test'=>[\app\controller\TestController::init(),'test'],
],
'POST' => [
],
'PUT' => [
],
'DELETE' => [
]
];
新增测试控制器#
<?php
/**
* Created By PhpStorm.
* User : Latent
* Date : 2021/4/15
* Time : 2:20 下午
**/
namespace app\controller;
use app\pool\DbPool;
class TestController
{
//每个控制器都应该有的单例
protected static $init;
public static function init()
{
if(is_null(static::$init)) {
echo "加载Test控制器单例"."\n";
static::$init = new self();
}
return static::$init;
}
public function test(object $request,object $response)
{
//业务逻辑
$db = new DbPool();
$id = $db->table('users')->insert([
'name'=>'latent',
'password'=>'',
'avatar'=>'',
'email'=>'pltruenine@163.com',
'created_at'=>date('Y-m-d H:i:s'),
'updated_at'=>date('Y-m-d H:i:s'),
'uid'=>'56895',
'age'=>22,
]);
$response->header('Content-Type','application/json');
$response->end(success([
'id'=>$id
],'插入成功'));
}
}
我们先来跑 hello world
#
public function test(object $request,object $response)
{
$response->header('Content-Type', 'text/html');
$response->end("hello world!");
}
这性能逼近 gRPC (3 万多)#
开始测试插入数据 启动测试服务器#
php http.php---------------
$ php http.php0.0.0.0:9501
测试浏览器访问 0.0.0.0:9501 尝试多请求几次#
测试命令行#
$ php http.php0.0.0.0:9501
当前使用内存:1489312
加载路由单例
加载Index控制器单例
加载Test控制器单例
当前使用内存:1584304
当前使用内存:1584304
当前使用内存:1584304
当前使用内存:1584304
当前使用内存:1584304
当前使用内存:1584304
当前使用内存:1584304
开始测试#
wrk -t4 -c50 -d30 http://127.0.0.1:9501/api/test
此时已经插入了 3 万多条数据了#
感觉不太行 可能是连接池的问题#
return [
'mysql' =>[
'host'=>'127.0.0.1',
'port'=>3306,
'coding'=>'utf8mb4',
'dbname'=>'swoole',
'username'=>'root',
'password'=>'root',
'size'=>60,#将15 改成60
]
];
连接池调大继续测试#
结论#
Latency
参数明显高了 但Requests/sec
只提高了 40 个的样子.
怎样才能继续提高性能🤔️#
可以帮我点个 star 吗#
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: