以下は、db-error.php の例。
<?php
header( 'HTTP/1.1 503 Service Unavailable' );
header( 'Content-Type: text/html; charset=utf-8' );
header( 'Retry-After: 600' );
?><!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Mysite | DB Error</title>
<link rel="stylesheet" href="http://mysite.com/wp-content/db-error.css" type="text/css" />
</head>
<body>
<div id="container">
<div id="header">
<h1 id="toptitle"><a href="http://www.mysite.com/">Mysite</a></h1>
</div><!-- end of #header -->
<div id="content">
<h2>503 Service Unavailable - DB Error</h2>
<p>ただいまシステム停止中です。大変ご迷惑をおかけしております。<br />
数分後に再度アクセスお願いいたします。</p>
<p>ご不便おかけしますが、よろしくお願いいたします。</p>
<p><a href="http://mysite.com/">http://mysite.com/</a></p>
</div><!-- end of #content -->
<div id="footer">
<address>Copyright © mysite. All rights reserved. </address>
</div><!-- end of #footer -->
</div><!-- end of #container -->
</body>
</html>
訂正:以下は不確かな内容です。もう少し調べてわかれば変更・修正する予定です。
ローカル環境と試験環境で試したが、作成したエラーメッセージは表示されず以下のメッセージが表示される。(試し方が、まずい可能性がある。試した方法は、データベース名やパスワードを変更するというもので、これではまず接続確立のエラーになるのは当然か。。。)
データベース接続確立のエラー
これは wp-config.php ファイルのユーザー名とパスワードが間違っているか、 localhost のデータベースサーバーに接続できないかのどちらかを意味します。ホストのデータベースサーバーがダウンしているのかもしれません。
•ユーザー名とパスワードに間違いはありませんか ?
•ホスト名に間違いはありませんか ?
•データベースサーバーは動いていますか ?
追記:先日、ローカル環境をサーバーに移行する際に、うまくいかず「データベース接続エラー」という表示になった。データベース名が違っている場合は上記のエラーがでたので、この違いは調べる必要がある。でも作成した「db-error.php 」は表示されなかった。(???)
調べてみると「dead_db()」という関数が「db-error.php」ファイルがあれば表示するようになっている。
//wp-includes/functions.php
function dead_db() {
global $wpdb;
// Load custom DB error template, if present. ここ
if ( file_exists( WP_CONTENT_DIR . '/db-error.php' ) ) {
require_once( WP_CONTENT_DIR . '/db-error.php' );
die();
}
// If installing or in the admin, provide the verbose message.
if ( defined('WP_INSTALLING') || defined('WP_ADMIN') )
wp_die($wpdb->error);
// Otherwise, be terse.
status_header( 500 );
nocache_headers();
header( 'Content-Type: text/html; charset=utf-8' );
wp_load_translations_early();
?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"<?php if ( is_rtl() ) echo ' dir="rtl"'; ?>>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title><?php _e( 'Database Error' ); ?></title>
</head>
<body>
<h1><?php _e( 'Error establishing a database connection' ); ?></h1>
</body>
</html>
<?php
die();
}
[/code]
「dead_db()」は、以下の2箇所で呼び出されていて、データベース関連のエラーがあるときに実行される。
/wp-includes/load.php -> line 350
function wp_set_wpdb_vars() {
global $wpdb, $table_prefix;
if ( !empty( $wpdb->error ) )
dead_db();
$wpdb->field_types = array( 'post_author' => '%d', 'post_parent' => '%d', 'menu_order' => '%d', 'term_id' => '%d', 'term_group' => '%d', 'term_taxonomy_id' => '%d',
'parent' => '%d', 'count' => '%d','object_id' => '%d', 'term_order' => '%d', 'ID' => '%d', 'comment_ID' => '%d', 'comment_post_ID' => '%d', 'comment_parent' => '%d',
'user_id' => '%d', 'link_id' => '%d', 'link_owner' => '%d', 'link_rating' => '%d', 'option_id' => '%d', 'blog_id' => '%d', 'meta_id' => '%d', 'post_id' => '%d',
'user_status' => '%d', 'umeta_id' => '%d', 'comment_karma' => '%d', 'comment_count' => '%d',
// multisite:
'active' => '%d', 'cat_id' => '%d', 'deleted' => '%d', 'lang_id' => '%d', 'mature' => '%d', 'public' => '%d', 'site_id' => '%d', 'spam' => '%d',
);
$prefix = $wpdb->set_prefix( $table_prefix );
if ( is_wp_error( $prefix ) ) {
wp_load_translations_early();
wp_die( __( '<strong>ERROR</strong>: <code>$table_prefix</code> in <code>wp-config.php</code> can only contain numbers, letters, and underscores.' ) );
}
}
/wp-includes/functions.php -> line 1154
function is_blog_installed() {
global $wpdb;
// Check cache first. If options table goes away and we have true cached, oh well.
if ( wp_cache_get( 'is_blog_installed' ) )
return true;
$suppress = $wpdb->suppress_errors();
if ( ! defined( 'WP_INSTALLING' ) ) {
$alloptions = wp_load_alloptions();
}
・・・省略・・・
// One or more tables exist. We are insane.
wp_load_translations_early();
// Die with a DB error.
$wpdb->error = sprintf( __( 'One or more database tables are unavailable. The database may need to be <a href="%s">repaired</a>.' ), 'maint/repair.php?referrer=is_blog_installed' );
dead_db();
}
$wpdb->suppress_errors( $suppress );
wp_cache_set( 'is_blog_installed', false );
return false;
}
wp_set_wpdb_vars() は /wp-settings.php -> line 76 で呼び出されている。
<?php /** * Used to set up and fix common variables and include * the WordPress procedural and class library. * Allows for some configuration in wp-config.php (see default-constants.php) */ /** * Stores the location of the WordPress directory of functions, classes, and core content. */ define( 'WPINC', 'wp-includes' ); // Include files required for initialization. require( ABSPATH . WPINC . '/load.php' ); require( ABSPATH . WPINC . '/default-constants.php' ); require( ABSPATH . WPINC . '/version.php' ); // Set initial default constants including WP_MEMORY_LIMIT, WP_MAX_MEMORY_LIMIT, WP_DEBUG, WP_CONTENT_DIR and WP_CACHE. wp_initial_constants( ); ・・・省略・・・ // Load early WordPress files. require( ABSPATH . WPINC . '/compat.php' ); require( ABSPATH . WPINC . '/functions.php' ); require( ABSPATH . WPINC . '/class-wp.php' ); require( ABSPATH . WPINC . '/class-wp-error.php' ); require( ABSPATH . WPINC . '/plugin.php' ); require( ABSPATH . WPINC . '/pomo/mo.php' ); // Include the wpdb class and, if present, a db.php database drop-in. require_wp_db(); // Set the database table prefix and the format specifiers for database table columns. $GLOBALS['table_prefix'] = $table_prefix; wp_set_wpdb_vars(); // Start the WordPress object cache, or an external object cache if the drop-in is present. wp_start_object_cache(); [/code] それでは、「ユーザー名とパスワードに間違いはありませんか ?・・・」などのメッセージはどこから来ているのか? 言語ファイル(ja.po)で検索して、その英語の表現を調べると該当する部分がある。 [code] \n <h1>Error establishing a database connection</h1>\n <p>This either means that the username and password information in your <code>wp-config.php</code> file is incorrect or we can't contact the database server at <code>%s</code>. This could mean your host's database server is down.</p>\n <ul>\n \t<li>Are you sure you have the correct username and password?</li>\n \t<li>Are you sure that you have typed the correct hostname?</li>\n \t<li>Are you sure that the database server is running?</li>\n </ul>\n <p>If you're unsure what these terms mean you should probably contact your host. If you still need help you can always visit the <a href='http://wordpress.org/support/'>WordPress Support Forums</a>.</p>\n
上記の文で検索すると、/wp-includes/wp-db.php -> line 1125 で定義されていて、/wp-includes/wp-db.php -> line 549 で呼び出されている。
WordPress DB Class のコンストラクタ
//wp-includes/wp-db.php -> line 549
function __construct( $dbuser, $dbpassword, $dbname, $dbhost ) {
register_shutdown_function( array( $this, '__destruct' ) );
if ( WP_DEBUG )
$this->show_errors();
$this->init_charset();
$this->dbuser = $dbuser;
$this->dbpassword = $dbpassword;
$this->dbname = $dbname;
$this->dbhost = $dbhost;
$this->db_connect();
}
データベースの選択と接続
//wp-includes/wp-db.php -> line 1125
function db_connect() {
$this->is_mysql = true;
$new_link = defined( 'MYSQL_NEW_LINK' ) ? MYSQL_NEW_LINK : true;
$client_flags = defined( 'MYSQL_CLIENT_FLAGS' ) ? MYSQL_CLIENT_FLAGS : 0;
if ( WP_DEBUG ) {
$this->dbh = mysql_connect( $this->dbhost, $this->dbuser, $this->dbpassword, $new_link, $client_flags );
} else {
$this->dbh = @mysql_connect( $this->dbhost, $this->dbuser, $this->dbpassword, $new_link, $client_flags );
}
if ( !$this->dbh ) {
wp_load_translations_early();
$this->bail( sprintf( __( "
<h1>Error establishing a database connection</h1>
<p>This either means that the username and password information in your <code>wp-config.php</code> file is incorrect or we can't contact the database server at <code>%s</code>. This could mean your host's database server is down.</p>
<ul>
<li>Are you sure you have the correct username and password?</li>
<li>Are you sure that you have typed the correct hostname?</li>
<li>Are you sure that the database server is running?</li>
</ul>
<p>If you're unsure what these terms mean you should probably contact your host. If you still need help you can always visit the <a href='http://wordpress.org/support/'>WordPress Support Forums</a>.</p>
" ), htmlspecialchars( $this->dbhost, ENT_QUOTES ) ), 'db_connect_fail' );
return;
}
$this->set_charset( $this->dbh );
$this->ready = true;
$this->select( $this->dbname, $this->dbh );
}
「bail」というメソッドを使って例の文を出力しているので、「bail」を調べると /wp-includes/wp-db.php -> line 1617 で次のように定義されている。
function bail( $message, $error_code = '500' ) {
if ( !$this->show_errors ) {
if ( class_exists( 'WP_Error' ) )
$this->error = new WP_Error($error_code, $message);
else
$this->error = $message;
return false;
}
wp_die($message);
}
データベース接続時に問題があると、「bail」というメソッドを使って「wp_die($message)」で例の文を出力している。
//wp-includes/functions.php -> line 2037
function wp_die( $message = '', $title = '', $args = array() ) {
if ( defined( 'DOING_AJAX' ) && DOING_AJAX )
$function = apply_filters( 'wp_die_ajax_handler', '_ajax_wp_die_handler' );
elseif ( defined( 'XMLRPC_REQUEST' ) && XMLRPC_REQUEST )
$function = apply_filters( 'wp_die_xmlrpc_handler', '_xmlrpc_wp_die_handler' );
else
$function = apply_filters( 'wp_die_handler', '_default_wp_die_handler' );
call_user_func( $function, $message, $title, $args );
}
取りあえず、db-error.php のエラーメッセージを表示するには、wp-db.php の $this->bail の実行の前に dead_db(); を実行させれば、表示される。以下のように wp-db.php に dead_db(); を追加して、ローカル環境で試してみると、エラーメッセージが表示されることは確認できたが、果たしてこれで問題がないかは不明。というより、やはりコアの部分なのでできればいじりたくない部分。
また、この時点では WordPress の関数などは読み込まれていないので、「is_user_logged_in() 」の関数やテンプレートタグなどは使用できない。
//wp-includes/wp-db.php -> line 1125
function db_connect() {
$this->is_mysql = true;
$new_link = defined( 'MYSQL_NEW_LINK' ) ? MYSQL_NEW_LINK : true;
$client_flags = defined( 'MYSQL_CLIENT_FLAGS' ) ? MYSQL_CLIENT_FLAGS : 0;
if ( WP_DEBUG ) {
$this->dbh = mysql_connect( $this->dbhost, $this->dbuser, $this->dbpassword, $new_link, $client_flags );
} else {
$this->dbh = @mysql_connect( $this->dbhost, $this->dbuser, $this->dbpassword, $new_link, $client_flags );
}
if ( !$this->dbh ) {
wp_load_translations_early();
dead_db(); //追記した部分。
$this->bail( sprintf( __( "
<h1>Error establishing a database connection</h1>
<p>This either means that the username and password information in your <code>wp-config.php</code> file is incorrect or we can't contact the database server at <code>%s</code>. This could mean your host's database server is down.</p>
<ul>
<li>Are you sure you have the correct username and password?</li>
<li>Are you sure that you have typed the correct hostname?</li>
<li>Are you sure that the database server is running?</li>
</ul>
<p>If you're unsure what these terms mean you should probably contact your host. If you still need help you can always visit the <a href='http://wordpress.org/support/'>WordPress Support Forums</a>.</p>
" ), htmlspecialchars( $this->dbhost, ENT_QUOTES ) ), 'db_connect_fail' );
return;
}
$this->set_charset( $this->dbh );
$this->ready = true;
$this->select( $this->dbname, $this->dbh );
}
どのタイミングで「dead_db()」が呼ばれるのかは、さらに調べる必要がありそう。。。
wp-settings.php が読み込まれるのと、db_connect() が実行されるのとどちらが先なのか?おそらく、db_connect() が先なのだと思うが、今のところ不明。