miau's blog?

トラブル対応

今日トラブル対応ということで客先に行ってたんですが、自分の作業っぷりがあまりにヘッポコだったので反省がてら書いてみます。

問題が起きてるのは、PHP から Perl を呼び出して処理するような部分らしい。


まず、Apache のエラーログがどこに吐かれるかわからなかったのがヘッポコ。
find で適当に検索したんだけど、なんか見当たらないのでほぼ手がかりなしの状態でデバッグ作業。

実際のところ、エラーログは作業ユーザが権限持ってないようなパスに存在してた。
ちゃんと自分で Apache インストールとかしたことがあれば、どこに入ってるかくらいわかるだろうに。
あまり実践やってないのがダメでした。


で、PHP でデバッグ用ログを吐くのも結構苦戦した。
結局 PHP は人のソースを眺める&ちょっといじるくらいしかやってないので、いざ自分で書くとできなかったりするわけで。
やはり Web アプリケーションの一つや二つ、趣味で作っておくべきですね。


さらに、Perl にちまちま print を入れつつデバッグやってると、

use lib "/hoge/fuga";

なんて行でコケてるらしいことがわかる。なぜ。

とりあえずエラー内容が知りたいので、eval を使う。


eval { use lib "/hoge/fuga"; };
print $@;

とやるけど、なにも出力されない。

正しくは

eval 'use lib "/hoge/fuga";';
print $@;

でした。
文字列を渡さないと実行時に処理されないんでした。


で、エラー内容は

Perl lib version (v5.6.1) doesn't match executable version (v5.8.3) at /usr/local/apache/lib/perl/Config.pm line 21.
Compilation failed in require at /usr/local/apache/lib/perl/lib.pm line 4.


とか。
Config.pm とか使ってないよ?
っていうかなんでバージョンが問題になってるの?


と、苦戦してると横から助け舟が。
テスト機は Apache を使ってるけど、本番機は Stronghold を使ってるんだとか。
で、Stronghold は結構クセがあるらしい。

具体的には
・Stronghold は独自に Perl をインストールしている(そのバージョンは 5.6.1 とか)
・Web から参照した場合、@INC の先頭に独自インストール側の Perl パスを持ってくる
んだとか。

で、PHP から Perl を呼ぶときは、元々入ってるほうの Perl(/usr/local/bin/perl とか。バージョンは 5.8.3)を絶対パスで呼んでいた。
Perl(5.8.3)から Perl(5.6.1)のライブラリ使うこともできそうなもんだけど・・・
どうも、lib.pm から呼ばれてる Config.pm で perl プログラムと Config.pm ライブラリのバージョンを比較して、違う場合は die しているらしい。

とりあえず暫定措置として、

BEGIN {
@INC = reverse @INC;
}


とか入れておいた。
本当は PHP から Perl 呼ぶときに /I オプション指定したほうがいいんだろうけど、まぁとりあえず。


なんというか・・・お客さんに助けられてどうするかな。
「結構常識ですけどね(意訳)」と追い打ちかけられるし。
posted at 21:33:29 on 2005-04-12 by miau - Category: Work No Trackbacks - Permalink

TrackBack

このエントリにトラックバックはありません
現在トラックバックは受け付けていません。

Comments

No comments yet

Add Comments

現在コメントは受け付けていません。
お手数ですが、 こちら のコメント欄にでも記載していただければと思います。