読者です 読者をやめる 読者になる 読者になる

PostgreSQLのUNIXドメインソケットとcreoleのDSN

AMNの広告配信サーバを、レンタルサーバから、ハウジングスペースの自前サーバに移行作業をしていますが、今回ようやくWeb1台+DB1台の構成になりました。(冗長性?なにそ(ry)


ついでにpgpoolを間に入れて、PHP(Apache)からはUNIXドメインソケットで接続するようにしました。DSNは設定ファイルに書いておいてそれをPHPプログラムから読み込むようになっていましたが、DB抽象化レイヤとして使用しているcreoleでは単一の文字列DSNからPostgreSQLUNIXドメインソケットによる接続はできないようです。


例えば以下のDSNがあったとして

pgsql://username:password@localhost/dbname

これはTCP接続でlocalhostにつなぎにいきます。PHPpg_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);

無事にUNIXドメインソケットでつながってはっぴー。

追記:コメントでid:tsukimiyaさんに教えてもらったとおり、

pgsql://user:pass@unix+localhost:port/dbname

でいけますね。ソースちゃんと読まんとあかんなー。