PostgreSQLのUNIXドメインソケットとcreoleのDSN
AMNの広告配信サーバを、レンタルサーバから、ハウジングスペースの自前サーバに移行作業をしていますが、今回ようやくWeb1台+DB1台の構成になりました。(冗長性?なにそ(ry)
ついでにpgpoolを間に入れて、PHP(Apache)からはUNIXドメインソケットで接続するようにしました。DSNは設定ファイルに書いておいてそれをPHPプログラムから読み込むようになっていましたが、DB抽象化レイヤとして使用しているcreoleでは単一の文字列DSNからPostgreSQLへUNIXドメインソケットによる接続はできないようです。
例えば以下のDSNがあったとして
pgsql://username:password@localhost/dbname
これはTCP接続でlocalhostにつなぎにいきます。PHPのpg_connect関数はhostパラメータがなければ自動的にUNIXドメインソケットになりますが、じゃぁ
pgsql://username:password@/dbname
としてみても、creoleの中で呼び出しているparse_urlでやっぱりエラーになります。そらそうか。
ということで単一文字列のDSNをあきらめ、設定ファイルに
[db_dsn] phptype = pgsql username = hoge password = fuga port = 5432 database = moge
と記述して、これを読み込んだ配列をCreole::getConnection()に渡すようにしました。一部を抜き出すとこんな感じ。
<?php try { // string-type DSN $dsn = BM_Config::get('dsn', 'db'); } catch (Exception $e) { if ($e->getCode() == BM_ERR_NO_CONFIG_NAME) { // array-type DSN $dsn = BM_Config::getCategory('db_dsn'); } } $db = Creole::getConnection($dsn);
追記:コメントでid:tsukimiyaさんに教えてもらったとおり、
pgsql://user:pass@unix+localhost:port/dbname
でいけますね。ソースちゃんと読まんとあかんなー。