mod_perl 環境で LWP::UserAgent を使うとき
さくらVPSに mod_perl を入れて Catalyst アプリを試してみてたんだけど、
"Can't locate utf8_heavy.pl in @INC (@INC contains: ...
というエラーにはじまり、以来延々ググっては試し、ググっては…
ちなみにアプリ自体は、Amazon の API 使って、LWP::UserAgent と XML::Simple で情報を取ってくるみたいな簡単なアプリ。
で最初は、@INC で指してるディレクトリにちゃんとモジュールあるじゃん!と思いながらも、“Can’t locate …“と言われてるから、startup.pl の中で明示的に use とか require とかして次々と出てくる”Can’t locate …“なモジュール達を追加していきました。
しかしそこで強敵あらわる。
"File does not exist: 501 Protocol scheme 'http' is not supported at ...
えー、なんだこれは!?
HTTP がサポートされていない??LWP がスパム判定されているのかな?とかいろいろ考えながら、ここからまた Apache の設定関連を延々ググりはじめる。。。
でも httpd.conf に大して特殊な設定とかした覚えないし、そもそも最初から mod_perl + Catalyst の設定のエントリとか参考にしてやってたし、と思い直して、今度は mod_perl + LWP::UserAgent 系で調べることに。
遅延ロードされるモジュールについてはuseとかrequireしただけでは、動的に読み込まれるモジュールについてはメモリ上にロードされません。という訳で色々ぶらさがってそうなモジュールの処理を一回流してみる、というのをやってます。
おぉ!まさに mod_perl + LWP::UserAgent について書いてくれている!
というか startup.pl について調べてたときにも目にしてたけど、見落としてた。
とりあえず解決策
startup.pl の中で、
use XML::Simple ();
use LWP::UserAgent ();
my $lwp = LWP::UserAgent->new(agent => 'My3594/1.0', timeout => 3);
my $res = $lwp->get("http://feeds.feedburner.jp/my3594-pedia-new_entry");
my $xs = new XML::Simple();
my $content = $xs->XMLin( $res->content );
その後、XML::Simple についても、
"XMLin() requires either XML::SAX or XML::Parser at ...
みたいなエラーが出たので、(どっちもちゃんとインストールされていたし)まとめて startup.pl の中で処理を流しておいてます。
これで一応エラーが出なくなり、肝心のアプリもとりあえず動いてます。でもまだ原因というか、mod_perl のこととか startup.pl に追加した方が良いモジュールのこととか、良く理解してないので、下記とかみて勉強しようと思う!
▼参考