• Swoole2.0协程客户端连接池的实现


    Swoole2.0官方默认的实例是短连接的,在请求处理完毕后就会切断redis或mysql的连接。实际项目可以使用连接池实现复用。

    实现原理也很简单,使用SplQueue,在请求到来时判断资源队列中是否有可用的连接,如果有直接拿来复用。如果没有就创建一个新的连接。在连接使用完毕后再讲它重新放回到队列,此连接就可以被其他协程复用。

    $count = 0;
    $pool = new SplQueue();
    $server = new SwooleHttpServer('127.0.0.1', 9501, SWOOLE_BASE);
    
    $server->on('Request', function($request, $response) use(&$count, $pool) {
        if (count($pool) == 0) {
            $redis = new SwooleCoroutineRedis();
            $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

  • 相关阅读:
    mysql的常用查询创建命令
    maven的简介
    google guava
    分库分表的情况下生成全局唯一的ID
    书单
    MD5Util
    UUID生成工具
    nodejs学习笔记三——nodejs使用富文本插件ueditor
    nodejs学习笔记二——链接mongodb
    mongodb 安装
  • 原文地址:https://www.cnblogs.com/houdj/p/8295429.html
Copyright © 2020-2023  润新知