localにphp5.3.1とwordpress2.8.6をインストールしてみるが、DBに繋がらないとのエラー。詳細が知りたいのでphp.iniのerror_logを設定してエラーログを見てみるが何も出力されてない。
<?php trigger_error('error raising!'); ?>
上記の様なスクリプトを実行してみると確かにエラーログに残るのだが・・・。
% grep -r @mysql .
./wp-includes/wp-db.php: $this->dbh = @mysql_connect($dbhost, $dbuser, $dbpassword, true);
./wp-includes/wp-db.php: if (!@mysql_select_db($db, $this->dbh)) {
./wp-includes/wp-db.php: $this->result = @mysql_query($query, $this->dbh);
./wp-includes/wp-db.php: while ($i < @mysql_num_fields($this->result)) {
./wp-includes/wp-db.php: $this->col_info[$i] = @mysql_fetch_field($this->result);
./wp-includes/wp-db.php: while ( $row = @mysql_fetch_object($this->result) ) {
./wp-includes/wp-db.php: @mysql_free_result($this->result);
なるほど・・・。
これだと原因究明が難しいのでmysql_connectの@を取って実行してみた。
% diff wp-includes/wp-db.php{,.org}
341c341
< $this->dbh = mysql_connect($dbhost, $dbuser, $dbpassword, true); # FIXED by komagata
---
> $this->dbh = @mysql_connect($dbhost, $dbuser, $dbpassword, true);
php_errors.log:
[14-Dec-2009 02:49:02] PHP Warning: mysql_connect() [<a href='function.mysql-connect'>function.mysql-connect</a>]: [2002] No such file or directory (trying to connect via unix:///tmp/mysql.sock) in /users/komagata/Sites/wordpress/wp-includes/wp-db.php on line 341
[14-Dec-2009 02:49:02] PHP Warning: mysql_connect() [<a href='function.mysql-connect'>function.mysql-connect</a>]: No such file or directory in /users/komagata/Sites/wordpress/wp-includes/wp-db.php on line 341
なるほど、/tmp/mysql.sockにソケットファイルがあると思っているために接続できないらしい。
PHP: 実行時設定 - Manualmysql.default_socket string
他にソケット名が指定されない場合、ローカルなデータベースサーバに 接続する時のデフォルトのソケット名。
php.iniにデフォルトのMySQLのsocketの場所を設定できる項目があることがわかった。ちなみに接続時のhostにもlocalhost:/path_to/mysql.sockといった指定が可能らしい。
PHPのマニュアルは非常に詳細な内容も記載されていて、日本語訳も充実しているので巷で問題になってたりすることの殆は公式マニュアルで解決することが多い。
macportsで入れた場合のmysqlのデフォルトのsocketの場所である/opt/local/var/run/mysql5/mysqld.sockを指定したら動いた。
問題解決のためにはコード内でエラー抑制はせず、各個人の環境でdisplay_errorsやerror_logを設定すべきだと思うが、php.iniが弄れない共有レンタルサーバーで使われることが多い事や、エラーがズラズラでてもパニックに陥るだけといった理由でこういう作りになっているのかなと思った。
本番環境ではすべきでないが、大抵の共有レンタルサーバーと同じ様にdisplay_errosをOnにした場合、エラー抑制子を外すと、データベースに接続できない場合はこんな感じになる。
たしかにちょっと怖い感じがするかも。初めてのインストールでこれが出たら諦めちゃう人も多いかも。