2012-03-15 96 views
5

我已经得到了设置三个phpcassa连接池的实例这样的数据访问类: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配置)限制了一些“最大连接数”,所以我现在正在研究这个问题。

回答

1

最后我没有搞砸TSocket $ persist参数......相反,我们编译了phpcassa自带的thrift库并启用了apc(我没有显式缓存连接池,但apc是opcode缓存等)。在这两次更改之间,三个池的连接池设置时间都缩短到了一位毫秒级的范围......这意味着我正在处理其他瓶颈问题。