PHP
Linux
MySQL
centos7

CentOS7でPHPからMySQLへの接続に手間取るの巻

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のバージョンの齟齬問題

以上をインストールしてアクセスしてみたところ、次のエラーが出た。

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のデフォルトの文字コードを修正してやれば動くはずである。

cf) php - PDO::__construct(): Server sent charset (255) unknown to the client. Please, report to the developers - Stack Overflow

/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 が正常に動作している事を確認できました。めでたし。