5

次のようなインスタンス化で3つの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サーバーのコードトレース機能を使用して、このクラスのパフォーマンス監査を少し行いましたが、これら3つの接続プールのセットアップに約100ミリ秒かかることに気付きました。このクラスのインスタンス化ごとに各接続が1回または2回しか使用されないことを考えると、接続のセットアップに負けるのはかなりの時間です。

これらの接続プールを一度構築して、クラスのインスタンス化間で共有できるようにする巧妙なトリックを知っている人はいますか?たぶん、それを行うための簡単な方法がいくつかあります。それは、より高度なPHP開発者にすぐに発生しますか?

更新: APCを使用して接続プールを「正常に」キャッシュし、永続的な接続の詳細を読み、phpcassaのconnection.phpファイル(59行目v 0.8.a.2)が次のようになっていることを発見しました。


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

...まあ、TSocketには3番目の(オプションの)パラメーター$persistがあります。デフォルトはfalseです。しかし、phpcassaの59行目を変更して$persistをtrueに設定すると、回帰テストはすべて地獄に落ちます。それらが失敗する方法は、私がどこかでいくつかの「最大接続」制限(おそらくcassandra構成)に達しているように見えるので、私は今それを調べています。

4

1 に答える 1

1

結局、私はTSocket $persistパラメーターをいじりませんでした...代わりにphpcassaに付属するthriftライブラリをコンパイルしてapcを有効にしました(接続プールを明示的にキャッシュしませんでしたが、apcはオペコードキャッシングなどです)。これらの2つの変更の間に、3つのプールの接続プールのセットアップ時間が1桁のミリ秒の範囲に落ちました...これは、他のボトルネックに直面していることを意味します。

于 2012-03-30T18:11:30.873 に答える