さくらサーバでPHP5.6でMYSQL8.0へ接続できなかったお話

今回は結論から申し上げます。
さくらサーバー(スタンダードプラン)で、PHP5.6からMYSQL8.0への接続は断念しました。
PHP5.6からMYSQL8.0へ接続するには、MYSQL側の設定を変更する必要があるのですが、MYSQLを他の利用者と共有しているレンタルサーバーでは、まず無理ということがわかりました。

占有サーバー等であれば、MYSQLの設定変更は可能ですが、共有サーバーでは他の利用者に影響が発生することから、そもそも編集権限がありません。

なにより、代替案のほうが実現的でした。
なので、私はPHP5.6からMYSQL8.0への接続は断念し、代替案で対処することにしました。

もしかしたら、グレーな方法でなんとかできるのかもしれません。
(ただ、スタンダードプランでPHP5.6からMYSQL8.0へ接続する方法は見つけられませんでした。)

ですが、代替案のほうが無難です。
ということで、今回はPHP5.6からMYSQL8.0へ接続するための体験談です。

PHP5.6からMYSQL8.0へ接続が必要になった経緯

さくらサーバーで、PHP5.6→PHP8.3へバージョンアップをしようと思いました。
そのためには、事前にPHPプログラムをPHP8.3に対応させる必要があります。
PHP8.3へバージョンアップした瞬間に、動かなくなることを防ぐためです。

そこで私は、PHP8.3に対応した最新版のPHPプログラムに乗せ換えることにしました。
その際に、最新版のPHPプログラムは、MYSQLのテーブルフォーマットが異なるため、別のMYSQLを構築する必要がありました。

現在、さくらサーバーのスタンダードプランで、新規でデータベース生成をすると、無条件でMYSQL8.0で生成されます。

以上の経緯より、PHP5.6でMYSQL8.0に接続する必要がでてきました。

実際にPHP5.6からMYSQL8.0へ接続しようとしたらエラーになりました

PHPからMYSQLへの接続は、PHPで標準装備されている関数でおこないます。
MYSQL8.0でも問題ないだろうと安易に考えていました。

実際にPHP5.6からMYSQL8.0で接続を実行してみたところ、以下のエラーが発生しました。

Warning: mysqli_real_connect(): Server sent charset (255) unknown to the client. Please, report to the developers in
Warning: mysqli_real_connect(): (HY000/2054): Server sent charset unknown to the client. Please, report to the developers in
Warning: mysqli_set_charset(): invalid object or resource mysqli in
Warning: mysqli_select_db(): invalid object or resource mysqli in
Warning: mysqli_errno(): invalid object or resource mysqli in
Warning: mysqli_error(): invalid object or resource mysqli in
Warning: mysqli_select_db(): invalid object or resource mysqli in

ワーニングだからと、たかをくくっいたら、本当にMYSQLに接続できていませんでした。

ググって原因を調べると、MYSQLの設定の問題というようなことが出てきました。
そこで、今まで使用していたMYSQL5.7へ接続してみると、問題なく接続できました。
また、PHP8.3の環境でMYSQL8.0へ接続してみると、これも問題なく接続できました。

原因を調べてみたところ、次のような内容でした。
MYSQL8.0で、接続方法が新しくなったため、対応していない言語のバージョンでは接続できません。」つまり、MYSQL8.0非対応のPHP5.6ではMYSQL8.0へ接続できないことがわかりました。

何とかする方法をググりましたが、レンタルサーバーではむつかしい方法でした。

早速「PHP5.6からMYSQL8.0へ接続する方法」で検索したところ、「MYSQL側の設定を変更すれば良い」という内容がでてきました。

実際、MYSQL側が接続拒否しているため、MYSQL側で接続拒否しないようにすれば解決するのは、自明の理です。

ですが、さくらサーバーのスタンダードは、共有サーバーであるため、my.cnfといったMYSQLの設定をコントロールパネルからは変更できません。

PHPの設定ファイルであるphp.iniは、ある程度コントロールパネルから変更でき、他の利用者に影響しない仕組みになっています。ですが、MYSQLの場合はそうなっていないようでした。

さくらサーバーでも、占有サーバーなど他の利用者に影響の出ないプランであれば、MYSQLの変更はできそうですが、スタンダードプランのような共有サーバーでは、まず無理です。

なので、MYSQLの設定を変更する方法は断念しました。
やはり他の利用者に迷惑をかけてはいけません。

そこで他の方法を模索しました

MYSQLの設定を変更せずに何とかする代案を模索し、以下の方法が有効でした。

  1. PHPを8.3にバージョンアップする
  2. MYSQL5.7で代用する

1.のPHPをバージョンアップすれば、そもそも回りくどいことしなくてもMYSQL8.0へ接続できるようになります。実際に、いずれはPHP8.3へバージョンアップするため、最終的な着地てんでもあります。

ですが、複数のサイトがあり、すべてのサイトがPHP8.3で動作する状態にしなければ、PHP8.3へバージョンアップできません。

そのための準備をしている段階なので、この方法はできません。

そこで、2.のMYSQL5.7で代用することにしました。

テーブル名が重複しないようにテーブル名を変更して対応

PHP5.6とMYSQL5.7であれば、問題なく接続できます。
ただ、さくらサーバーでは、MYSQL5.7のデータベースは、新規で追加できなくなっています。
(新規追加すると、無条件でMYSQL8.0で追加されます)

なので、既存のデータベースを利用するしかありません。
その際に問題なのは、テーブル名が重複することです。

同じテーブル名では、新たにテーブル追加できません。
そこで、PHPプログラム側のMYSQLテーブル名を変更して対応することにしました。

テーブル名を変更すれば、既存のテーブル名と重複しなくなります。
これで、無事PHP5.6の環境でPHP8.3にバージョンアップするための下準備ができました。

一気にPHP8.3へバージョンアップできればそれでよい話なのですが

今回は、PHP5.6からMYSQL8.0へ接続しようとしてうまくいかなかった体験でしたが、そもそもの話、最初から一気にPHP8.3へバージョンをあげてしまえば特に問題のない話でした。

それができなかったのは、サイトが多数あるためです。
すべてのサイトがPHP8.3で動作する状態にしてかからないと、PHP8.3にしたとたん、サイトが正しく表示されなくなります。

仕事でサーバー運営をしている場合、それは致命的です。
なので、回りくどいことをしても、サイトが常時表示されている状態をキープしなければいけないのです。

サイトの運営は、想像よりより気を使わねばいけないものなのです。

今回のレポートは以上です。
読んでいただいてありがとうございました。


ホームページに関するお悩み事やご相談事がございましたら私どもまでご連絡ください。 鋭意ご対応申し上げます。
ホームページのご提案もさせていただいております