ココがポイント
レンタルサーバーが移転となりCGIプログラムに不具合がでました!
レンタルサーバー屋さんから通知
理由は良く分かりませんが、レンタルサーバー屋さんから、メールにて、現在利用しているサーバーの移転をする旨の通知が来ていました。
ユーザーの方では、特にやる事はないというので何の心配もしていませんでした。
ココに注意
現在の環境のまま新サーバーに移転
しかし、移転直後から、CGIは動かないし、PHPも動かなくなる物がでてきてしまい、本当に迷惑です。
データを変更すると不具合が発生する!
CGIの方は、データを登録、更新、削除などをすると、データファイルの中身が、ゼロになってしまうという不具合が発生しました。
PHPの方に関しても、データを登録、更新、削除などをすると、不具合が発生するというような現象でした。
PHPに関しては、レンタルサーバーの管理パネルから、PHPのバージョンを下げたら回復しました。
ココに注意
PHPプログラムが古いので最新に対応してなかったのか!?
結局、PHP8.3から、PHP5.6に変更したら改善しました。
何かPHPがバージョンアップして、使えないコードでもでてきたのでしょうかね。
バージョンアップするのはいいけど、コードが変わるのは本当に困ります。
さて、CGIの方は改善されませんでした。
CGIでデータがゼロになる原因を追究
ココがおすすめ
最近は、AIにコードを入れて聞いてしまうのが便利です!
CopilotやGeminiなどのAIにコードを入れて調査しました。
まずは、新規登録部分のコードから調べましたが、3か所ほど指摘されて1ヶ所ずつコードを入れ替えて検証しました。
#会員名簿登録実行**************************************************
sub kaiin_touroku02 {
local($_, $errflg, $msg);
local(@buf, @data);
$no_id = $no_id_s1 . "-" . $no_id_s2;
if (!open(LOG, "+<../dat/kaiin.dat")) { &error('Error Can not open kaiin-file'); }
eval 'flock(LOG, 2)';
#追加* if (!open(LOG, ">>../dat/kaiin.dat")) { &error('Error Can not open kaiin-file'); }
#追加* flock(LOG, 2) or die "Cannot lock file: $!";
@buf = <LOG>;
$errflg = "";
foreach(@buf) {
@data = split(/\t/);
if($data[0] eq $no_id) { $errflg = $no_id; }
}
if ($errflg eq "") {
push(@buf, "$no_id\t$office\t$tel\t$fax\t$adress\t$email\t$url\t$pr\t$bikou\t$mngr\t$administ\t$place\t$map_url\n");
seek(LOG, 0, 0);
print LOG @buf;
eval 'truncate(LOG, tell(LOG));';
}
#追加* if ($errflg eq "") {
# ファイルの末尾に新しいデータを追記
#追加* print LOG "$no_id\t$office\t$tel\t$fax\t$adress\t$email\t$url\t$pr\t$bikou\t$mngr\t$administ\t$place\t$map_url\n";
#追加* }
# ロックを解除
flock(LOG, 8);
close(LOG);
if ($errflg eq "") {
## sort
#修正前* system("/usr/local/bin/nkf -e ../dat/kaiin.dat | /bin/sort -k1.3n| /usr/local/bin/nkf -s > ../dat/temp.dat");
#修正前* system("/bin/cp ../dat/temp.dat ../dat/kaiin.dat");
# メモリ上でソートする例 (簡略化)
open(my $fh, '<', '../dat/kaiin.dat') or die "Cannot open file: $!";
my @lines = <$fh>;
close($fh);
# ソート処理 (実際のソート条件に合わせて変更)
my @sorted_lines = sort { $a cmp $b } @lines;
open(my $fh, '>', '../dat/kaiin.dat') or die "Cannot open file: $!";
print $fh @sorted_lines;
close($fh);
}
上のコードの「追加」と書いてあるコードが、AIから指摘されて入れ替えてみましたが、現象は変わらなかったコードになります。
そして、不具合が改善されたコードが、ソートするコードでした。
自分は、CGIプログラムに関してはよく理解していませんので推測で話してしまいますが、このシステムは、データを追加や更新したら、IDで並び替えているようです。
その並び替えの時に、temp.datに出力してから、元のkaiin.datに上書きしているような仕組みのようです。
つまり、このコードの部分がダメだって事ですね。
system("/usr/local/bin/nkf -e ../dat/kaiin.dat | /bin/sort -k1.3n| /usr/local/bin/nkf -s > ../dat/temp.dat");
system("/bin/cp ../dat/temp.dat ../dat/kaiin.dat");そこで、AIが提案してくれたコードに置き換えたら見事に回復しました。
コードを修正したら回復したが・・・
今回不具合のあるCGIコードの新規登録部分を修正して、他の部分も修正しようとした直前に、レンタルサーバー屋さんのサポートからメールが届きました。
今まで普通に使えていたCGIが不具合を起こしていたので、原因を調べてもらう事は当然の権利ですね。
回答は、
エラーログを確認しますと、 /usr/local/bin/nkf がないというエラーが出ておりました。nkf は標準ではサーバに用意しておりませんでしたので、さきほどインストールいたしました。
ココがダメ
旧サーバーと同じ環境で移転してくれたんじゃないの?
自分で、AIに聞きながら、CGIプログラムを修正しましたが、nkfというのをサーバーにインストールしたことで、CGIを修正することなく不具合は改善しました。
この無駄な労力を、どこに請求したらよいのでしょうか!?
とんだ茶番に振り回されてしまったという出来事でした。ふぅー。

