搭建一个基于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 协议》,转载必须注明作者和本文链接
推荐文章: