[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 メーリングリストの案内