我有一个数据访问类,在实例化中设置三个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开发人员?
UPDATE:使用APC“成功”缓存连接池,然后阅读有关持久连接的更多信息,发现phpcassa的connection.php文件(第59行v 0.8.a.2)读取如下:
$socket = new TSocket($host, $port);
......好吧,TSocket有第三个(可选)参数$ persist,默认为false。但是当我在phpcassa中更改第59行以将$ persist设置为true时,我的回归测试对我来说完全是地狱。他们失败的方式让我看起来像某个地方遇到了一些“最大连接”限制(大概是cassandra配置),所以我现在正在研究它。
答案 0 :(得分:1)
最后我没有搞乱TSocket $ persist参数...而是我们编译了phpcassa附带的thrift库并启用了apc(我没有显式缓存连接池,但是apc是操作码缓存,等等)。在这两个更改之间,三个池的连接池设置时间降至一位数毫秒范围......这意味着我正处于其他瓶颈状态。