Swoole2.0协程客户端连接池的实现
2017-01-04 10:59
267 查看
Swoole2.0官方默认的实例是短连接的,在请求处理完毕后就会切断redis或mysql的连接。实际项目可以使用连接池实现复用。
实现原理也很简单,使用SplQueue,在请求到来时判断资源队列中是否有可用的连接,如果有直接拿来复用。如果没有就创建一个新的连接。在连接使用完毕后再讲它重新放回到队列,此连接就可以被其他协程复用。
此连接池代码也可用于其他协程客户端包括MySQL、HttpClient、TCPClient等。
协程没办法像异步回调程序一样可以对请求进行排队,然后通过事件驱动触发,没办法等到资源池可用。因此不太方便限制连接的数量。生产环境建议对连接池最大值做限制,操作最大连接数后,要拒绝客户端发起新的请求。
转自:https://my.oschina.net/matyhtf/blog/818339
实现原理也很简单,使用SplQueue,在请求到来时判断资源队列中是否有可用的连接,如果有直接拿来复用。如果没有就创建一个新的连接。在连接使用完毕后再讲它重新放回到队列,此连接就可以被其他协程复用。
$count = 0; $pool = new SplQueue(); $server = new Swoole\Http\Server('127.0.0.1', 9501, SWOOLE_BASE); $server->on('Request', function($request, $response) use(&$count, $pool) { if (count($pool) == 0) { $redis = new Swoole\Coroutine\Redis(); $res = $redis->connect('127.0.0.1', 6379); if ($res == false) { $response->end("redis connect fail!"); return; } $pool->push($redis); $count++; } $redis = $pool->pop(); $ret = $redis->set('key', 'value'); $response->end("swoole response is ok, count = $count, result=" . var_export($ret, true)); $pool->push($redis); }); $server->start();
此连接池代码也可用于其他协程客户端包括MySQL、HttpClient、TCPClient等。
协程没办法像异步回调程序一样可以对请求进行排队,然后通过事件驱动触发,没办法等到资源池可用。因此不太方便限制连接的数量。生产环境建议对连接池最大值做限制,操作最大连接数后,要拒绝客户端发起新的请求。
if (count($pool) == 0) { if ($count > 100) { $response->status(500); $response->end("<h1>连接池已满,无法提供服务,请稍后重试</h1>"); } }
转自:https://my.oschina.net/matyhtf/blog/818339
相关文章推荐
- Swoole2.0协程客户端连接池的实现
- Swoole2.0协程客户端连接池的实现
- 带连接池的netty客户端核心功能实现剖解
- swoole实现Timer定时器、心跳检测及Task进阶实例:mysql连接池
- redis java客户端Jedis 连接池实现
- 带连接池的netty客户端核心功能实现剖解
- swoole实现数据库连接池
- swoole扩展实现真正的数据库连接池
- 基于 Swoole 2 协程特性实现的 MySQL 连接池
- redis java客户端Jedis 实现 连接池 + 简单的负载均衡
- java客户端Jedis操作Redis Sentinel 连接池的实现方法
- 用swoole实现mysql的连接池--摘自https://github.com/153734009/doc/blob/master/php/mysql_pool.php
- mysql,redis客户端连接池和线程池的Linux C编程实现(★firecat推荐★)
- RabbitMQ客户端连接池的实现
- 实现Thrift客户端连接池
- Thrift学习笔记(4)--实现Thrift客户端连接池
- PHP Yaf + Swoole 实现MySQL 连接池
- Swoole2.0协程原理及实现
- COM+服务器的.Net组件实现 - 客户端
- Oracle连接池的实现