wata.dev

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 系で調べることに。

2009-04-05 - マツモブログ

遅延ロードされるモジュールについては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 に追加した方が良いモジュールのこととか、良く理解してないので、下記とかみて勉強しようと思う!

▼参考

ブログの記事一覧