2012-03-15 172 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緩存等)。在這兩次更改之間,三個池的連接池設置時間都縮短到了一位毫秒級的範圍......這意味着我正在處理其他瓶頸問題。