5

我有一个数据访问类,它在实例化时设置了三个 phpcassa 连接池,如下所示:


try {
  $this->cache = new ConnectionPool(
    BSCACHE_KEYSPACE,
    explode(',', BSCACHE_SERVERS),
    null, null, null, null, null,
    array(
      'username' => BSCACHE_USERNAME,
      'password' => BSCACHE_PASSWORD
    )
  );
  $this->indexCache = new ConnectionPool(
    INDEXCACHE_KEYSPACE,
    explode(',', INDEXCACHE_SERVERS),
    null, null, null, null, null,
    array(
      'username' => INDEXCACHE_USERNAME,
      'password' => INDEXCACHE_PASSWORD
    )
  );

  $this->metaCache = new ConnectionPool(
    METACACHE_KEYSPACE,
    explode(',', METACACHE_SERVERS),
    null, null, null, null, null,
    array(
      'username' => METACACHE_USERNAME,
      'password' => METACACHE_PASSWORD
    )
  );
} catch (Exception $e) {
  return array($this->error['connection']);
}

我最近在zend的php服务器上使用了代码跟踪功能对这个类进行了一点性能审计,注意到这三个连接池的设置消耗了大约100ms。考虑到每个连接在这个类的每个实例化中只使用一次或两次,这会浪费很多时间来设置连接。

任何人都知道任何可以让我构建这些连接池并在类的实例之间共享它们的聪明技巧吗?也许有一些简单的方法可以立即用于更高级的 PHP 开发人员?

更新:是否“成功”使用 APC 缓存连接池,然后阅读有关持久连接的更多信息,发现 phpcassa 的 connection.php 文件(第 59 行 v 0.8.a.2)如下所示:


$socket = new TSocket($host, $port);

...好吧,TSocket 有第三个(可选)参数 $persist,默认为 false。但是当我将 phpcassa 中的第 59 行更改为将 $persist 设置为 true 时,我的回归测试对我来说简直就是地狱。他们失败的方式让我看起来像是在某个地方达到了一些“最大连接数”限制(大概是 cassandra 配置),所以我现在正在调查。

4

1 回答 1

1

最后我没有弄乱 TSocket $persist 参数...相反,我们编译了 phpcassa 附带的 thrift 库并启用了 apc(我没有显式缓存连接池,但 apc 是操作码缓存等)。在这两个更改之间,我的三个池的连接池设置时间下降到个位数毫秒范围内……这意味着我遇到了其他瓶颈。

于 2012-03-30T18:11:30.873 回答