swoole HTTP服务器中异步MySQL

还是直接上代码:



$http = new swoole_http_server("0.0.0.0", 9501);

$http->on('request', function($request, $response){
    $swoole_mysql1 = new Swoole\Coroutine\MySQL();
    $swoole_mysql2 = new Swoole\Coroutine\MySQL();

    $swoole_mysql1->connect([
        'host' => '127.0.0.1',
        'port' => 3306,
        'user' => 'root',
        'password' => 'root',
        'database' => 'swoole',
    ]);
    $swoole_mysql2->connect([
        'host' => '127.0.0.1',
        'port' => 3306,
        'user' => 'root',
        'password' => 'root',
        'database' => 'swoole',
    ]);

    $res1 = $swoole_mysql1->query('SELECT * FROM data1');
    $res2 = $swoole_mysql2->query('SELECT * FROM data2');

    $response->header("Content-Type", "text/html; charset=utf-8");
    $response->end("

Hello Swoole. #".count($res1).count($res2)."

"
); }); $http->start();

使用浏览器访问。http://ip:9501
异步MySQL可以不需要等待第一条查询完成后再执行第二条,在访问不同服务器,不同数据库,不同的表时效果比较明显。
对比同步MySQL查询代码:

php

$http = new swoole_http_server("0.0.0.0", 9501);

$http->on('request', function($request, $response){
    $swoole_mysql1 = mysqli_connect('127.0.0.1', 'root', 'root', 'swoole', 3306);
    $swoole_mysql2 = mysqli_connect('127.0.0.1', 'root', 'root', 'swoole', 3306);

    $res1 = $swoole_mysql1->query('SELECT * FROM data1');
    $res2 = $swoole_mysql2->query('SELECT * FROM data2');

    $response->header("Content-Type", "text/html; charset=utf-8");
    $response->end("

Hello Swoole. #".$res1->num_rows.$res2->num_rows."

"
); }); $http->start();

同步代码使用PHP原生方式查询数据。
放上两种查询方式的使用ab进行的性能测试:
ab -c 100 -n 1000 http://127.0.0.1:9501/
异步查询:

Server Software:        swoole-http-server
Server Hostname:        127.0.0.1
Server Port:            9501

Document Path:          /
Document Length:        30 bytes

Concurrency Level:      100
Time taken for tests:   1.477 seconds
Complete requests:      1000
Failed requests:        0
Write errors:           0
Total transferred:      193000 bytes
HTML transferred:       30000 bytes
Requests per second:    676.82 [#/sec] (mean)
Time per request:       147.749 [ms] (mean)
Time per request:       1.477 [ms] (mean, across all concurrent requests)
Transfer rate:          127.57 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    1   1.8      0       7
Processing:     4  140  24.0    145     156
Waiting:        0  140  24.1    145     156
Total:          7  140  22.6    145     160

Percentage of the requests served within a certain time (ms)
  50%    145
  66%    146
  75%    148
  80%    148
  90%    150
  95%    152
  98%    153
  99%    154
 100%    160 (longest request)

同步查询:

Server Software:        swoole-http-server
Server Hostname:        127.0.0.1
Server Port:            9501

Document Path:          /
Document Length:        30 bytes

Concurrency Level:      100
Time taken for tests:   2.765 seconds
Complete requests:      1000
Failed requests:        0
Write errors:           0
Total transferred:      193000 bytes
HTML transferred:       30000 bytes
Requests per second:    361.67 [#/sec] (mean)
Time per request:       276.493 [ms] (mean)
Time per request:       2.765 [ms] (mean, across all concurrent requests)
Transfer rate:          68.17 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.4      0       2
Processing:     4  262  48.5    272     295
Waiting:        4  262  48.5    272     295
Total:          6  262  48.2    272     295

Percentage of the requests served within a certain time (ms)
  50%    272
  66%    278
  75%    281
  80%    284
  90%    287
  95%    291
  98%    293
  99%    294
 100%    295 (longest request)

你可能感兴趣的:(PHP,Swoole)