CentOS7でWordpressを構築していた時にDB接続で躓いたので記録しておく。
TL;DR
-
php-mysql
ではなくphp-mysqlnd
を使う - MySQL 8.x のデフォルト文字コードを従来の物に戻す
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
collation-server = utf8_unicode_ci
character-set-server = utf8
- MySQL 8.x のデフォルト認証形式を従来の物に戻す
[mysqld]
default_authentication_plugin = mysql_native_password
事の起こり: PHPとMySQLのバージョンの齟齬問題
- PHPは
yum
で入れた5.4.16
- MySQLは、MySQL公式のyumリポジトリで入れた
8.0.12
- Wordpress は事情により
4.7.11
以上をインストールしてアクセスしてみたところ、次のエラーが出た。
mysqli::real_connect(): Headers and client library minor version mismatch.
エラーが出る意外は正常に動作している。もっと言えば、WP_DEBUG_DISPLAY
が false ならばエラーに気付きすらしない。だが気持ち悪い。
少し調査したところ、PHPとMySQLのバージョン違いに起因するとの事だった。しかしながら、MySQLを入れ直すのも億劫だった小生は、php-mysql
ではなく php-mysqlnd
を使えば良いという情報を仕入れてその様にしてみる。当然の事ながらこの2つは競合するので、先に php-mysql
を削除してから php-mysqlnd
を導入する
$ yum remove -y php-mysql
$ yum install -y php-mysqlnd
$ systemctl restart httpd.service
これで解決!と思いきや勿論そんな事はなく、別の刺客が現れるのであった。
MySQLの文字コード問題
次に出てきたエラーはこれだ。
mysql_connect(): Server sent charset (255) unknown to the client.
「MySQLのやつがよくわからん文字コードで返してきた」などと云っている様だ。もはやこれは接続に失敗しているので、当然 Wordpress は正常に動作しない。つまり状況は悪化していると言える。
調べてみると、MySQLのバージョン8からデフォルトの文字コードが utfmb4
に変更されたらしい。その為、クライアントであるPHPと会話が出来ていないのだろう。そうであるならば、MySQLのデフォルトの文字コードを修正してやれば動くはずである。
/etc/my.cnf
に次のように記述を追加して、
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
collation-server = utf8_unicode_ci
character-set-server = utf8
mysqld を再起動してやる。
$ systemctl restart mysqld.service
これで解決!と期待したが、やはりまだ刺客が隠れていた様だった。
MySQLの認証形式問題
次のエラーはこれだ。
mysql_connect(): The server requested authentication method unknown to the client [caching_sha2_password]
「MySQLのやつが未知の認証方式を使ってて門前払いを食らった」などと云っている。
caching_sha2_password
と言うのはMySQLバージョン8から追加された認証方式なので、PHP5.4側が追随できていないという事なのだろう。ここは従来の mysql_native_password
を使って認証をする事にした。
/etc/my.cnf
の [mysqld]
セクションに次のように追記しておく。
[mysqld]
default_authentication_plugin = mysql_native_password
そして再起動。
$ systemctl restart mysqld.service
これで解決!今度こそ解決! Wordpress が正常に動作している事を確認できました。めでたし。