搭建一个基于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 协议》,转载必须注明作者和本文链接
不成大牛,不改個簽
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!