gcdb::check_connection()

最后更新于:2021-11-26 07:57:24

gcdb::check_connection( bool$allow_bail=true)

Checks that the connection to the database is still up. If not, try to reconnect.

参数

$allow_bail

(bool) (Optional) Allows the function to bail.

Default value: true

响应

(bool|void) True if the connection is up.

源文件

文件: gc-includes/gc-db.php

	public function check_connection( $allow_bail = true ) {
		if ( $this->use_mysqli ) {
			if ( ! empty( $this->dbh ) && mysqli_ping( $this->dbh ) ) {
				return true;
			}
		} else {
			if ( ! empty( $this->dbh ) && mysql_ping( $this->dbh ) ) {
				return true;
			}
		}

		$error_reporting = false;

		// Disable warnings, as we don't want to see a multitude of "unable to connect" messages.
		if ( GC_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 && GC_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 gc_die()/dead_db().
		// Let's just return and hope for the best.
		if ( did_action( 'template_redirect' ) ) {
			return false;
		}

		if ( ! $allow_bail ) {
			return false;
		}

		gc_load_translations_early();

		$message = '<h1>' . __( 'Error reconnecting to the database' ) . "</h1>n";

		$message .= '<p>' . sprintf(
			/* translators: %s: Database host. */
			__( 'This means that we lost contact with the database server at %s. This could mean your host&#8217;s database server is down.' ),
			'<code>' . htmlspecialchars( $this->dbhost, ENT_QUOTES ) . '</code>'
		) . "</p>n";

		$message .= "<ul>n";
		$message .= '<li>' . __( 'Are you sure the database server is running?' ) . "</li>n";
		$message .= '<li>' . __( 'Are you sure the database server is not under particularly heavy load?' ) . "</li>n";
		$message .= "</ul>n";

		$message .= '<p>' . sprintf(
			/* translators: %s: Support forums URL. */
			__( 'If you&#8217;re unsure what these terms mean you should probably contact your host. If you still need help you can always visit the <a href="https://docs.gechiui.com/classes/gcdb/check_connection/%s">GeChiUI Support Forums</a>.' ),
			__( 'https://gechiui.org/support/forums/' )
		) . "</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();
	}