пулы соединений phpcassa - PullRequest
5 голосов
/ 16 марта 2012

У меня есть класс доступа к данным, который настраивает три пула подключений 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']);
}

Недавно я использовал функцию трассировки кода на php-сервере zend для небольшого аудита производительности этого класса и заметил, что настройка этих трех пулов соединений занимает ~ 100 мс. Это очень много времени, чтобы потерять настройку соединения, учитывая, что каждое соединение используется только один или два раза для каждого экземпляра этого класса.

Кто-нибудь знает какие-нибудь хитрые уловки, которые позволили бы мне создать эти пулы соединений один раз и распределить их между экземплярами класса? Может быть, есть какой-то простой способ сделать это, что произойдет сразу же с более продвинутыми разработчиками PHP?

ОБНОВЛЕНИЕ:"Успешно" кэшировал пулы соединений с помощью APC, затем прочитал больше о постоянных соединениях и обнаружил, что файл phpcassa connection.php (строка 59 v 0.8.a.2) выглядит следующим образом:


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

... хорошо, у TSocket есть третий (необязательный) параметр $ persist, который по умолчанию равен false. Но когда я изменяю строку 59 в phpcassa, чтобы установить для $ persist значение true, мои регрессионные тесты идут мне в ад. То, как они терпят неудачу, создает впечатление, что я где-то достигаю некоторого предела «максимальных соединений» (предположительно, в конфигурации cassandra), так что теперь я изучаю это.

1 Ответ

1 голос
/ 30 марта 2012

В конце концов, я не связывался с параметром TSocket $ persist ... вместо этого мы скомпилировали комиссионную библиотеку, которая поставляется с phpcassa и включили apc (я явно не кэшировал пулы соединений, но apc - это кэширование кода операции,так далее).Между этими двумя изменениями время установки моего пула соединений для трех пулов упало до однозначного миллисекундного диапазона ... что означает, что я нахожусь в других узких местах.

...