WordPress で PHPのバージョンに関する警告が出る、そしてデータベース接続確立エラー

WordPress 5.1 に更新したせいか、管理画面のダッシュボードでPHPのバージョンに関する警告が出るようになった。

f:id:savakan:20190316132118p:plain

!PHPの更新が必要です
サイトが安全ではいバージョンのPHPを実行していることを検出しました。

PHPとは何ですか?サイトにどう影響しますか?

PHPはWordPressの構築およびメンテナンスに使用されるプログラミング言語です。
新しいバージョンのPHPはより高速かつ安全であるため、更新することでサイトのパフォーマンスに良い影響を与えます。

PHPの更新についてさらに詳しく

公式としては、現行の動作要件は以下のようになっている。

wordpress.org


古いPHP(5.2.4)でも動作するが、前述のような警告が出た上に、WordPressが最低限の動作要件を引き上げるとなると、困るケースがありそう。

例えば、
 CentOS 6:PHP 5.3+MySQL 5.1
 CentOS 7:PHP 5.4+MariaDB 5.5
など、RHEL系で標準リポジトリを使っている場合。

Remiリポジトリへ切り替えたり、ソースからビルドしたPHPの環境が必要になる。


WordPress の動作要件の遷移については、調べた方がいるのでリンク。

blog.hinaloe.net



なお、PHP 7系となると、PHPの古いMySQL関数(mysql)が廃止されている。

従って、古いMySQL関数を使ったプラグインがあれば、動作しなくなる。

php.net



PHP Compatibility Checker」というプラグインで、各PHPバージョンにおけるプラグインの互換性を検証できるので、事前にチェックしておくと良い。



ソースからビルドしたPHP 7.x へ切り替えた際、環境によってはデータベース接続確立エラーが発生する。

f:id:savakan:20190316132415p:plain

データベース接続確立エラー

これは、wp-config.php ファイルのユーザー名とパスワードが正しくないか、あるいはlocalhostのデータベースサーバーに接続できないかのどちらかを意味します。
ホスティングサービスのデータベースサーバーがダウンしているかもしれません。
 ・ユーザー名とパスワードに間違いはありませんか?
 ・正しいホスト名を入力しましたか?
 ・データベースサーバーは稼働していますか?

こうした用途が何を意味しているのか分からない場合は、ホスティングサービスに連絡するべきでしょう。
助けが必要であれば、いつでもWordPressサポートフォーラムを訪れることができます。

wp-config.php にて、ユーザ名とパスワードを変更していないなら、データベースへの接続方法の指定に問題がある。

WordPressをDEBUGモード有効で動作させると、画面に次のようなメッセージが表示される。

Warning: mysqli_real_connect(): (HY000/2002): No such file or directory 
in /wordpress-path/wp-includes/wp-db.php on line 1612

No such file or directory

該当ファイルを見ると、、、

1611  if ( WP_DEBUG ) {
1612      mysqli_real_connect( $this->dbh, $host, $this->dbuser, $this->dbpassword, null, $port, $socket, $client_flags );
1613  } else {
1614      @mysqli_real_connect( $this->dbh, $host, $this->dbuser, $this->dbpassword, null, $port, $socket, $client_flags );
1615  }


「No such file or directory」というメッセージからは判断するに、ソケットファイルが見つからないものかもしれない。


回避方法として、2つ挙げておく。

回避方法1

接続ホスト名を localhost127.0.0.1 に変更する。

/** MySQL のホスト名 */
define( 'DB_HOST', 'localhost' );
 ↓
/** MySQL のホスト名 */
define( 'DB_HOST', '127.0.0.1' );

レンタルサーバでは、こちらの方法になると思われる。

回避方法2

php.ini の mysqli.default_socket にソケットのパスを設定する。

パスを調べるには、

# ps aux | grep mariadb
mysql     4984  0.0  0.7 1178220 31860 ?       Sl    204  33:13 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --log-error=/var/log/mariadb/mariadb.log --pid-file=/var/run/mariadb/mariadb.pid --socket=/var/lib/mysql/mysql.sock

など。

この場合、/var/lib/mysql/mysql.sock がソケットのパス。

php.ini へ設定を記載する。

mysqli.default_socket =
 ↓
mysqli.default_socket = /var/lib/mysql/mysql.sock