LoginSignup
17
9

More than 5 years have passed since last update.

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

Posted at

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

17
9
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
9