PHP的异步Web服务器+异步Redis客户端

PHP的异步并行swoole扩展在1.7.7中内置了一个Http服务器,利用swoole_http_server可以轻松实现一个PHP的异步Web服务器,性能比php-fpm/Apache等同步阻塞的服务器高出数倍。

swoole官方还提供了redis-async,一个异步IO+连接池的Redis客户端。这2个功能结合起来就可以打造一个并发请求数万的Web应用。

使用方法

1. 下载安装swoole扩展

可以使用pecl安装或者从github下载swoole最新的stable版本。

pecl install swoole

修改php.ini加入extension=swoole.so

2、下载redis-async代码

git clone https://github.com/swoole/redis-async.git

3、编写服务器代码server.php

$http = new swoole_http_server("127.0.0.1", 9501);
$http->set(['worker_num' => 8]);
require __DIR__.'/src/Swoole/Async/RedisClient.php';
$redis = new Swoole\Async\RedisClient('127.0.0.1');

$http->on('request', function ($request, $response) use ($redis) {
    $redis->get('key1', function($result) use($response) {
        $response->end("<h1>Hello Swoole. value=".$result."</h1>");
    });
});

$http->start();

运行server.php程序,这里一共启动了8个进程。注意由于是异步非阻塞的服务器程序,所以不需要像Apache/PHP-fpm那样开启数百的进程。这里完全是没有等待的,全部是事件驱动。当请求到来发起redis请求,redis-server响应后会触发对应的事件,再渲染页面,将HTML页面通过$response->end接口发送给浏览器。

php server.php

Http服务器启动监听了9501端口,浏览器中可以打开 http://127.0.0.1:9501 访问页面。本程序的逻辑很简单,只是从redis中取一个数据,并渲染页面。

4、使用ab工具进行压力测试

ab -c 200 -n 100000 -k http://127.0.0.1:9501/

机器环境是:Inter CoreI5 4核CPU+8G内存,Ubuntu 14.04

压测结果:

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

Document Path:          /
Document Length:        40 bytes

Concurrency Level:      200
Time taken for tests:   2.853 seconds
Complete requests:      100000
Failed requests:        0
Keep-Alive requests:    100000
Total transferred:      16800000 bytes
HTML transferred:       4000000 bytes
Requests per second:    35049.02 [#/sec] (mean)
Time per request:       5.706 [ms] (mean)
Time per request:       0.029 [ms] (mean, across all concurrent requests)
Transfer rate:          5750.23 [Kbytes/sec] received

可以达到3.5万QPS,性能惊人,仅仅使用一台普通的PC机器,硬件性能一般。如果是在服务器硬件环境中,性能可以更好。

5、与Nginx+PHP-fpm结果对比

PHP-fpm已开启OpCache,采用phpredis扩展,已启用pconnect长连接,测试启动80进程。测试代码如下:

$redis = new redis;
$redis->pconnect('127.0.0.1');
$result = $redis->get('key1');
echo "<h1>Hello Swoole. value=".$result."</h1>";

测试结果:

Server Software:        nginx/1.4.6
Server Hostname:        127.0.0.1
Server Port:            80

Document Path:          /redis.php
Document Length:        40 bytes

Concurrency Level:      200
Time taken for tests:   15.605 seconds
Complete requests:      100000
Failed requests:        0
Keep-Alive requests:    0
Total transferred:      21000000 bytes
HTML transferred:       4000000 bytes
Requests per second:    6408.33 [#/sec] (mean)
Time per request:       31.209 [ms] (mean)
Time per request:       0.156 [ms] (mean, across all concurrent requests)
Transfer rate:          1314.21 [Kbytes/sec] received


转载于:https://my.oschina.net/matyhtf/blog/338800

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值