※対象のバージョンは4.1です
WordPressインストール時にwp-config.phpに正しいデータベース接続情報を入力してもinstall時にデータベース接続エラーが表示される場合があります
その調査・対処方法を記します
なぜデータベースエラーが起こるかを調査する
データベース接続処理はwp-admin/install.phpを見ると
wp-admin/intall.php
require_once( ABSPATH . WPINC . '/wp-db.php' );
で行っているようなのでその処理を見てみます
wp-includes/wp-db.phpの578行目にコンストラクタが定義されています
wp-includes/wp-db.php
public function __construct( $dbuser, $dbpassword, $dbname, $dbhost ) {
register_shutdown_function( array( $this, '__destruct' ) );
if ( WP_DEBUG && WP_DEBUG_DISPLAY )
$this->show_errors();
テスト用コードの実行
コンストラクタの実装はわかったので、wp-db.phpと同じディレクトリにテストコードを書いてみます
<?php
require('./wp-db.php');
$dbuser = 'wordpress'; #データベースに設定したユーザを指定してください
$dbpassword = 'wordpress'; #上のユーザのパスワード指定してください
$dbname = 'wordpress'; #データベース名を指定してください
$dbhost = 'localhost';
$db = new wpdb($dbuser, $dbpassword, $dbname, $dbhost);
そしてこちらを実行してみます
すると以下のようなエラーが表示されます
PHP Warning: mysql_connect(): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) in /usr/local/apache2/htdocs/wp/wp-includes/wp-db.php on line 1416
ん?/tmp/mysql.sockにsocketファイルを探しに行ってるようです
実際にsocketファイルがどこにあるのか確認します
$ ps -ef | grep mysql
root 15423 1 0 Feb11 ? 00:00:00 /bin/sh /usr/bin/mysqld_safe --datadir=/var/lib/mysql --socket=/var/lib/mysql/mysql.sock --pid-file=/var/run/mysqld/mysqld.pid --basedir=/usr --user=mysql
mysql 15642 15423 0 Feb11 ? 00:06:43 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --user=mysql --log-error=/var/log/mysqld.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/lib/mysql/mysql.sock
/var/lib/mysql/mysql.sockになってますね。。。
socketファイルのパス指定方法調査と修正
もう一度wp-db.phpを見てみると1370行目に
wp-db.php
$port_or_socket = strstr( $host, ':' );
という記述がある。ということは$dbhostを
localhost:/var/lib/mysql/mysql.sock
と指定すればよいということになります
テストコードで動作確認をし、エラーなくインスタンスの生成ができることを確認しました
※$port_or_socketという変数名ですがlocalhost:3306では動作しませんでした
wp-config.phpの修正
wp-config.php
define('DB_HOST', 'localhost:/var/lib/mysql/mysql.sock');
に修正してからインストールを実行するとエラーが解消されました