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机器,硬件性能一般。如果是在服务器硬件环境中,性能可以更好。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。