8年以上前に公開したWebアプリが、気付いたら動かなくなっていた...
今となっては古いUIでお恥ずかしい限りですが、2017年にバックエンドはPHP5系で、フロントエンドはAngularJS(一応、当時Angular2はリリースされていたようですが、まだAngularJSも一定のシェアを握っていた時代)で構築していたアプリです。
アプリのコンテンツは、「絶景マップ」というもので、旅好きの私と嫁ちゃんが実際に行ったことがある全国の絶景を一覧/地図上でピン表示/都道府県やジャンルごとに検索できる...といったようなものです。
本アプリは、Wordpressで作成した私のブログと同じドメイン/レンタルサーバ上で稼働しており、SEO観点でブログのレスポンス高速化のため、PHPのバージョンを5系から8系に変更した結果、Webアプリの方がひっそりと動かなくなっていたようです。
PHPのバージョンを上げた当時は、Wordpress側でPHPバージョンアップに伴う庶務に忙殺されていたこともあり、Webアプリのことなどすっかり忘れておりました。
動かなくなっていた原因を探る1
ロリポップレンタルサーバだとエラーの補足が難しかった
さて、アプリが「動かなくなっていた」の状態ですが、フロントエンドの「ガワ」だけは表示されており、バックエンドにデータの問い合わせを行った時にPHP側でエラーが発生していた、という状態でした。
じゃあとりあえずPHPのログを見に行きますかと思っていましたが... 「ログが見れねぇ!」
どうやら、契約しているレンタルサーバ(ロリポップ)でLiteSpeed版にしている場合は、ログ出力設定を変更できないようす...
仕方がないので、XAMPPでローカル環境を構築し、エラーを観測できるようにしました。
DBもロリポップ側からデータをダンプし、ローカルにインポートして環境を再現しました。
エラー内容はまさかの...
最近、個人アカウントでもGoogle AI Proプランを契約し始めたので、早速Geminiにコードとエラー内容を投げて原因調査を依頼しました。この間わずか10秒。
コードの一部抜粋が下記(この時点で見る人が見れば「ココ原因やん」で分かると思いますが、今までPHP5系だと動いていたので目が曇っていました)。
<?php
define("LOG_FILE", "./log/request.log");
// 全ユーザ対象にセッションを開始する
session_start();
// iniファイル読込
$configs = parse_ini_file("../dbconfig.ini", true);
if (!configs) {
die("cannot open ini file...");
}
// callbackパラメータを取得
$callback = $_GET["callback"];
if (isset($callback)) {
// PDOに変更
$dbh = null; // ブロックスコープなしなんで、ここで宣言する必要はないのだけれど...
try {
表示されていたエラーは下記。まあ、原因はぱっと見でわかっちゃうんですが、一応Geminiを噛ませてみます。
Fatal error: Uncaught Error: Undefined constant "configs" in C:\xampp\htdocs\webapps\zekkei-map\index.php:10 Stack trace: #0 {main} thrown in C:\xampp\htdocs\webapps\zekkei-map\index.php on line 10
これに対するGeminiの回答は以下。そりゃそう。お恥ずかしい限りです...
動かなくなっていた原因を探る2
さて、$configsとconfigsのタイポですが、どうやらPHP5系ではエラーにすることもなく普通に解釈して動いてしまうようでした。それが、PHP7以降ではエラーとなる様子。コチラの方が新規開発時は圧倒的に嬉しいですね。
PHPは昔のバージョンでは、特定の状況下で変数に $ (ドルマーク) を付け忘れても動作してしまうことがありましたが、PHP 7以降 でこの挙動が大きく変わり、Fatal error (致命的なエラー) になるようになりました。
さて、ここを修正して再実行すればもうアプリが直りきっているだろうと期待を込めてアプリを開くと...!!
めっちゃエラーが出ました!!これが2つのメジャーバージョンアップの壁か!?
とてもライトなコードしか載っていないたった1つのPHPファイルのマイグレーションでこれだとすると、中規模以上のPHPマイグレーションは絶望かもしれない。
[08-Jul-2025 05:42:14 Europe/Berlin] PHP Warning: Undefined array key "w_hasnoimg" in C:\ftp\hogefoobar\webapps\zekkei-map\index.php on line 174
[08-Jul-2025 05:42:14 Europe/Berlin] PHP Warning: Undefined array key "tag" in C:\ftp\hogefoobar\webapps\zekkei-map\index.php on line 55
[08-Jul-2025 05:42:14 Europe/Berlin] PHP Warning: Undefined array key "tag" in C:\ftp\hogefoobar\webapps\zekkei-map\index.php on line 55
[08-Jul-2025 05:42:14 Europe/Berlin] PHP Warning: Undefined array key "tag" in C:\ftp\hogefoobar\webapps\zekkei-map\index.php on line 55
[08-Jul-2025 05:42:14 Europe/Berlin] PHP Warning: Undefined array key "tag" in C:\ftp\hogefoobar\webapps\zekkei-map\index.php on line 55
[08-Jul-2025 05:42:14 Europe/Berlin] PHP Warning: Undefined array key "tag" in C:\ftp\hogefoobar\webapps\zekkei-map\index.php on line 55
[08-Jul-2025 05:42:20 Europe/Berlin] PHP Warning: Undefined array key "w_byname" in C:\ftp\hogefoobar\webapps\zekkei-map\index.php on line 502
[08-Jul-2025 05:42:20 Europe/Berlin] PHP Fatal error: Uncaught TypeError: implode(): Argument #2 ($array) must be of type ?array, string given in C:\ftp\hogefoobar\webapps\zekkei-map\index.php:505
Stack trace:
#0 C:\ftp\hogefoobar\webapps\zekkei-map\index.php(505): implode(Array, ',')
#1 {main}
thrown in C:\ftp\hogefoobar\webapps\zekkei-map\index.php on line 505
実際はもっと沢山エラーが出ていましたが、割愛します。
公式(Geminiが知れる)情報がある、かつ、マイグレーションのような割と機械的に対応可能な場合は精度高くやってくれそうなので、
「このエラー内容を受けて、もともとのphpファイルをリライトして欲しいんだけど出来る?」って聞いちゃいました。
いけるようです。ちゃんとコード付きで結果を出力してくれました。
念のため、Git上での差分確認と、Local環境での動作確認を行いましたが、大丈夫そう!
バージョンアップ対応がめっちゃ楽になって感動
今回は個人開発の簡単なPHPアプリだったのでアレですが、人力で真面目に作業しようとすると4時間程度はかかりそうですが、AIを活用したことで実際の作業時間は30分以内で済みました。
本業であれば、さらなる影響調査、現新テスト等やることはさらに多いので同じコード量でももっとコストがかかりそうですが、そのそれぞれでもさらにAI活用が出来ますし、2024年末から続くAIによる生産性向上の波に感動するばかりであります。
10年以上詰んできたITナレッジが、いきなりAIによってカバーされることに恐ろしさを覚えている毎日ですが、逆に乗りこなす側にシフトしていこうと頑張って足掻いていきます!
今回は以上です。