/** * Check that the connection to the database is still up. If not, try to reconnect. * * If this function is unable to reconnect, it will forcibly die, or if after the * the template_redirect hook has been fired, return false instead. * * If $allow_bail is false, the lack of database connection will need * to be handled manually. * * @since 3.9.0 * * @param bool $allow_bail Optional. Allows the function to bail. Default true. * * @return bool|void True if the connection is up. */ public function check_connection($allow_bail = true) { if ($this->dbh->ping()) { return true; } $error_reporting = false; // Disable warnings, as we don't want to see a multitude of "unable to connect" messages if (WP_DEBUG) { $error_reporting = error_reporting(); error_reporting($error_reporting & ~E_WARNING); } for ($tries = 1; $tries <= $this->reconnect_retries; $tries++) { // On the last try, re-enable warnings. We want to see a single instance of the // "unable to connect" message on the bail() screen, if it appears. if ($this->reconnect_retries === $tries && WP_DEBUG) { error_reporting($error_reporting); } if ($this->db_connect(false)) { if ($error_reporting) { error_reporting($error_reporting); } return true; } sleep(1); } // If template_redirect has already happened, it's too late for wp_die()/dead_db(). // Let's just return and hope for the best. if (did_action('template_redirect')) { return false; } if (!$allow_bail) { return false; } wp_load_translations_early(); $message = '<h1>' . __('Error reconnecting to the database') . "</h1>\n"; $message .= '<p>' . sprintf(__('This means that we lost contact with the database server at %s. This could mean your host’s database server is down.'), '<code>' . htmlspecialchars($this->dbhost, ENT_QUOTES) . '</code>') . "</p>\n"; $message .= "<ul>\n"; $message .= '<li>' . __('Are you sure that the database server is running?') . "</li>\n"; $message .= '<li>' . __('Are you sure that the database server is not under particularly heavy load?') . "</li>\n"; $message .= "</ul>\n"; $message .= '<p>' . sprintf(__('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="%s">WordPress Support Forums</a>.'), __('https://wordpress.org/support/')) . "</p>\n"; // We weren't able to reconnect, so we better bail. $this->bail($message, 'db_connect_fail'); // Call dead_db() if bail didn't die, because this database is no more. It has ceased to be (at least temporarily). dead_db(); }