MySQL を二つ立ち上げたサーバで PHP から一方の MySQL につながらない現象を調べる修行

PHP 5 系と MySQL 5 系をインストールしたサーバに、PHP 4 系と MySQL 4 系もインストール。元々入れてある MySQL サーバ (以降 mysqld5) のリスンポートが 3306 なので、新しく入れる MySQL サーバ (以降 mysqld4) のリスンポートを 13306 にして起動。コマンドラインのクライアント (mysql コマンド) からだと、ちゃんと localhost の 13306 番で、mysqld4 につながる。のに、PHP からだと、ポート番号を 13306 に指定しても myswld5mysqld5 につながってしまう。
php.inimy.cnf で設定した mysql.default_host = localhostmysql.default_port = 13306 はちゃんと効いているのに ...

いろいろ調べた挙句 ...
どうやら PHP から MySQL に接続する際、ホスト名が localhost だと、インターネットドメインでなく、UNIX ドメインでソケットを取得するとのこと。早い話、「localhost だから」と気を利かせて、ファイルシステム上のソケットを直アクセスするので、ポート番号など関係なし。でもって、デフォルトのソケットパスは /tmp/mysql.sock で、これは mysqld5 も同じなので、結局 mysqld5 サーバに接続してしまう。
ということだった。

解決方法は二つ。

  1. ホスト名を localhost でなく、127.0.0.1 として強制的にインターネットドメインを使わせる。
  2. UNIX ドメインで使われるソケットパス mysql.default_socket を php.inimy.cnf などで明示的に指定する。

とりあえず、今回は (2) で対応したところ、うまくいった。うーん、まさにバッドノウハウ

訂正 (2008-07-15)

my.cnf と書くべきところを php.ini とか書いてたので修正。あと typo も修正。