PHP5以前の古いプログラムをXserverビジネス(Maria DB10.5x)に移行した時のメモ

サーバー移行対応の案件で、PHP5以前の環境で構築された古いプログラムを、サーバー移転に伴いPHP7に対応したときのメモ。

移行前と移行後のサーバーで、MySQLのバージョンが異なることによりエラーが発生。

最終的には、PHPのバージョンを7.4まで上げて、mysql関数をmysqliに書き換える事で対応した。今後、レガシーなPHPプログラムの対応は増えてくると思うので備忘録として残しておく。

移行前移行後
サーバーXserverXserverビジネス
PHP5.6.40(非推奨)7.4.33(非推奨)
MySQLMySQL 5.7.xMaria DB 10.5.x
ホストmysql○○.xserver.jplocalhost

ちなみにXserverが推奨するPHPのバージョンは8.1.22。(2023年12月現在)
XserverもXserverビジネスも、5.1.6〜8.2.9まで任意で選択できるようになっている。

Xserverは2021年3月以降の新規契約については、提供するDBがMariaDB10.5に変更となった。あわせて、接続先がlocalhostに変更された模様。契約時期により、DBのバージョン(MySQL5.0/MySQL5.5/MySQL5.7/MariaDB10.5)と接続先のホストが異なるので注意。

https://www.xserver.ne.jp/support/faq/service_db_expire.php

目次

エラー:Headers and client library minor version mismatch.

mysql_connect関数で以下のエラーが出力された。

Warning: mysql_connect(): Headers and client library minor version mismatch. Headers:〇〇 Library:△△

これは、PHPから指定しているMySQLのバージョンと、実際にインストールされているMySQLのバージョンがズレている(ミスマッチ)事によるエラー。

PHP 5.6.40とMariaDB 10.5.xの組み合わせではHeaders:50568 Library:100148となった。phpinfoで確認してみると、mysqliのClient API header versionの値が5.5.68-MariaDBとなっていた。

今回のように、レンタルサーバーの仕様でデータベースのバージョン変更ができないケースでは、PHPのバージョンを上げることでバージョンを揃える必要がある。

PHP8までバージョンアップしたいところだが、PHP8以降エラーレベルが変更されて厳しくなっている為、全面的なリファクタリングが必要になるのでPHP7.4までにとどめておく。

また後述するとおり、mysql_connectはPHP7.0.0で削除された関数のため、mysqli_connectに置き換える必要がある。

MySQLとMariaDBのバージョン対応

MySQLMariaDB
バージョン5.55.5
5.610.0〜10.1
5.710.2〜10.3
8.010.4〜11.1
MariaDB versus MySQL: Compatibilityより作成

MariaDBのサイトによれば、MySQL5.7がMariaDB10.2〜10.3相当との事。

確かに、PHP5.6&MariaDB 10.3の環境(Mixhost)だと上記のHeaders and client library minor version mismatchエラーは発生しなかった。

Fatal error: Uncaught Error: Call to undefined unction mysql_….

Fatal error: Uncaught Error: Call to undefined function mysql_select_db()…
Fatal error: Uncaught Error: Call to undefined function mysql_query()…
Fatal error: Uncaught Error: Call to undefined function mysql_fetch_array()…

mysql関数は、PHP5.5以降で非推奨、PHP7.0.0で廃止となった。主にSQLインジェクションへの対策のため。

PHP7.0以降の環境で動作させるためには、mysql関数をmysqlの拡張版であるmysqli(mysql improved)に書き換えるか、PDO(PHP Data Object)を利用した記述に変更する必要がある。

今回の案件では、四半期中のフルリニューアルを控えていた為、暫定対応でmysqliへの書き換え対応を行った。

PHP7以降のバージョンではmysql関数が使用できないのでmysqliに書き換え

スクロールできます
mysql(PHP5まで)mysqli(PHP7以降)備考
mysql_connect($host, $user, $pass, $dbname);mysqli_connect($host, $user, $pass, $dbname);DB接続リソース($link)
mysql_select_db($dbname);mysqli_select_db($link, $dbname);第1引数にDB接続リソースを入れる
mysql_query($query);mysqli_query($link, $query);第1引数にDB接続リソースを入れる
mysql_affected_rows();mysqli_affected_rows($link);引数にDB接続リソースを入れる
mysql_num_rows($result);mysqli_num_rows($result);
mysql_fetch_array($result);mysqli_fetch_array($result);

mysqlの部分をmysqliに書き換える(iをつけるだけ)。引数にDB接続リソースが必要になる関数は注意。
上記の他mysqli〜関数の詳細は公式ドキュメントを参照されたし。

余談:Xserverの姉妹サービス?

今回の案件ではエックスサーバーからXserverビジネスへの移行だったのだけれど、新規申し込みではPHPもDBも環境はほとんど同じである。契約時期により、DBが古いケースがある模様。

ところでエックスサーバー系列だけで、3つもサービスがある件。
下記は2023年12月現在の情報。コスパで見るとエックスサーバーが凄まじい。

シン・レンタルサーバーはCPU・メモリのリソース保証ではない点に注意。
リソース保証つきのシン・レンタルサーバー「リザーブドプラン」が別にある。
リザーブド同士だとエックスサーバーの方が安い。

エックスサーバーについてはスタンダードプランから「リソース保証」あり。
2021年10月に全プランを対象に「CPU・メモリリソース保証」機能が導入された。

Xserverビジネスの良いところは何か?
.co.jpドメインの永久無料と、1日1回のWEB改ざん検知(30ページまで)、99.99%のSLAあたりはメリットになり得る。無料設定代行とホームページ制作は、恩恵を受けられる人は少ない印象。

スクロールできます
シン・レンタルサーバーエックスサーバーXserverビジネス
初期費用0円0円16,500円
月額料金770円〜
(36ヶ月契約時)
990円〜
(36ヶ月契約時)
3,762円〜
(36ヶ月契約時)
ドメイン永久無料1つ
.com .netなど
2つ
.com .net など
2つ
.co.jpも対応
容量300GB
(NVMe)
300GB
(NVMe)
300GB
(NVMe)
vCPU6コア6コア
リソース保証
非公開
メモリ8GB8GB
リソース保証
非公開
RAIDRAID10RAID10非公開
サーバーnginxnginxnginx
マルチドメイン無制限無制限無制限
データベースMariaDB 10.5MariaDB 10.5MariaDB 10.5
データベース数無制限無制限無制限
DBユーザー数無制限50無制限
DB容量
(1個あたりの目安)
5GB5GB5GB
PHPPHP8/PHP7PHP8/PHP7/PHP5PHP8/PHP7/PHP5
SSI
WAF
データセンター国内国内国内
バックアップ過去14日過去14日過去14日
SLA(品質保証制度)99.99%
サポート電話/メール電話/メール電話/メール
WEBフォント3ドメイン
75,000PV/月
3ドメイン
75,000PV/月
3ドメイン
PV無制限
設定代行有料ビジネスプラン以上月3回
HP制作HP無料制作サービス
WEB改ざん検知1サイト
高性能スパムフィルタ
(Cloudmark)
1001,000
SECOM
セキュリティ診断
  • URLをコピーしました!
  • URLをコピーしました!

WHO WROTE

komadairaのアバター komadaira 代表社員・COO

地方テレビ局、歯科コンサル、中堅SIerを経て独立。ダイヤルアップ接続の時代にHTMLに魅せられ、なんだかんだ10年以上WEB制作に関わり続けている。

目次