[PHP-users 21215]Re: pgsqlconnectエラー
Tatsuo Ishii
t-ishii @ sra.co.jp
2004年 4月 9日 (金) 10:07:15 JST
石井です.
> libpq の PGconnectStart() のソースを読むと、UNIX ドメインソケットか
> どうかは host の値が / で始まっているかどうかで判断しているように見え
> ます。host がなければ UNIX ドメインソケット(パス名はデフォルト)で、
> host があってその値が / で始まる絶対パスの場合は、そのパス名をソケット
> として UNIX ドメインソケットで接続するという理解で間違っていますでしょ
> うか?
PQconnectStart()から呼び出されるconnectDBStart()まで追っ掛けるとわかる
と思いますが,ちょっと違います.その関数の中で,以下のようなマクロを使っ
てUnixドメインソケットのパス名を作っています.
#define UNIXSOCK_PATH(sun,port,defpath) \
snprintf((sun).sun_path, sizeof((sun).sun_path), "%s/.s.PGSQL.%d", \
((defpath) && *(defpath) != '\0') ? (defpath) : \
DEFAULT_PGSOCKET_DIR, \
(port))
hostは結局このマクロのdefpath引数に渡されるだけで,.s.PGSQL... 以下は
hostだけでは制御できません.
> > たぶん,Unixドメインソケットを使って「ポート」番号5433で接続するために
> > は,
> >
> > 'protocol' => 'tcp'
> > 'hostspec' => ''
> > 'port' => '5433'
> >
> > とかしないといけないと思うのですが.
>
> すいません。UNIX ドメインソケットのポート番号というのがどうもよく理
> 解できません。sys/un.h の struct sockaddr_un にあるように、UNIX ドメイ
> ンソケットはパス名のみで区別されると理解しているのですが、鍵かっこつき
> で「ポート」と書かれているということは、何か別の意味があるのでしょうか。
もちろんUnixドメインソケットにはポート番号という概念はありませんが,
PostgreSQLでは便宜的にpostmasterとかlibpqなどのクライアントインターフェ
イスの引数に表れる「ポート番号」をソケットのパス名の一部に使っている,
ということを言いたかったのです.たとえば,postmaster -p 5433 で起動し
ているpostmasterに接続するためには,/tmp/.s.PGSQL.5433というソケットを
指定しなければなりません.
> 標準以外のパスで UNIX ドメインソケットを用いて接続したい場合は
>
> $dsn = array(
> 'phptype' => 'pgsql',
> 'dbsyntax' => 'pgsql',
> 'username' => 'www',
> 'protocol' => 'unix',
> 'socket' => '/path/to/unix/domain/socket',
> 'database' => 'test_db',
> );
>
> とすれば良いと思います。(試してません)
というわけで,この例だと
/path/to/unix/domain/socket/.s.PGSQL.5432
というUnixドメインソケットに接続に行ってしまうことになりますね.
--
Tatsuo Ishii
PHP-users メーリングリストの案内