某お客様が使用中のレンタルサーバが PHP 4 → PHP 5 にアップデートされ、今まで稼動していた osCommerce が動かなくなったとのこと。PHP4 なんてとうの昔にサポートが終了しているし、最新版の osCommerce ではこのようなことはないのだが、とりあえずの解決策をメモしておく。
現象
osCommerce が
FATAL ERROR: register_globals is disabled in php.ini, please enable it!
というエラーを吐いて動かなくなった。そこで、設定で register_globals を on にすると、次は
Fatal error: Using $this when not in object context in /home/***/includes/header.php on line 404
というエラーを出しはじめた。
解決法
PHP5 では class の中以外では $this という変数名を使えなくなった。そのため、すべての PHP ファイルを調べて、class の外で使われている $this を $THIS などの適当な変数に置換することで解決した。
未検証だが、たぶん次のような Perl スクリプト (update.pl) で自動化できる。
#!/usr/bin/perl
use strict;
foreach my $file (@ARGV) {
if (!open(FH, '+<' . $file)) { next; }
my @lines = <FH>;
seek(FH, 0, 0);
truncate(FH, 0);
my $flag = 1;
foreach (@lines) {
if ($_ =~ /^[\t|\s]+class /) { $flag = 0; }
if ($flag) { $_ =~ s/\$this\->/\$THIS\->/g; }
print FH $_;
}
close(FH);
print "update: " . $file . "\n";
}
コマンドラインで osCommerce のディレクトリに移動し、このスクリプトを次のように実行すれば良い。
$ find . -name '*.php' | xargs perl ./update.pl
早めに最新版にアップデートしないとな。。
コメント