Perl の LWP::UserAgent と XML::FeedPP を使って何かする時に、毎回フレッシュなデータを取ってきてたのですが、場合によっては一定期間は同じデータを使いまわしたいという事が出てきたのでキャッシュ機能を付けてみることにしました。
キャッシュ部分には Cache::File モジュールを使います。
キャッシュ機能をこんな感じにつけてみました。
#!/usr/bin/perl
use strict;
use warnings;
use LWP::UserAgent;
use XML::FeedPP;
use Cache::File;
my $url = 'https://worklog.be/feed';
my $params = {
cache_root => '/tmp/mycache',
default_expires => '600sec'
};
my $c = new Cache::File($params);
$c->purge();
my $cache = $c->get($url);
if (!$cache) {
my $res = &lwp_get($url);
if ($res) {
$c->set($url, $res->content);
$cache = $c->get($url);
print "get: $url\n\n";
} else {
print "error: $url\n\n";
exit;
}
} else {
print "cache: $url\n\n";
}
my $feed = XML::FeedPP->new($cache);
foreach ($feed->get_item()) {
print $_->title(), "\n";
}
sub lwp_get {
my $url = shift || return(0);
my $lwp = '';
my $res = 0;
$lwp = LWP::UserAgent->new(
timeout => 30
);
$res = $lwp->get($url);
if (!$res->is_success) {
$res = 0;
}
return($res);
}
exit;
キャッシュがなければ LWP::UserAgent で取得して $res->content でコンテンツデータのみをキャッシュに保存。
後は XML::FeedPP がそのキャッシュデータを読み込むという具合です。
XML::FeedPP で作成されるオブジェクト毎キャッシュした方が便利かとも思ったのですがそうでも無かったのでこんな感じに。
実行結果は以下。
Cache なし
$ perl feed_cache.pl get: https://worklog.be/feed PerlからWordPressを操作する WordPressのwp_optionsテーブルって結構便利 PerlとかPHPで外部コマンドを実行した時の戻り値を判定する WordPressのstyle.cssに任意のバージョンを設定する WordPressで利用するファイルのExpiresヘッダを見直す WordPressで作ったコンテンツを最適化する試み WP Super Cache の手動インストールメモ WordPressでMinified化したstyle.min.cssを使う TwentyFourteenに関連記事を表示する機能を追加する TwentyFourteenにリッチスニペット対応のパンくずリストを追加
Cache あり
$ perl feed_cache.pl cache: https://worklog.be/feed PerlからWordPressを操作する WordPressのwp_optionsテーブルって結構便利 PerlとかPHPで外部コマンドを実行した時の戻り値を判定する WordPressのstyle.cssに任意のバージョンを設定する WordPressで利用するファイルのExpiresヘッダを見直す WordPressで作ったコンテンツを最適化する試み WP Super Cache の手動インストールメモ WordPressでMinified化したstyle.min.cssを使う TwentyFourteenに関連記事を表示する機能を追加する TwentyFourteenにリッチスニペット対応のパンくずリストを追加
LWP でキャッシュを使うには他にもモジュールがあるのですが、試した感じ Cache::File が個人的には使いやすいと思いました。
簡単ですが PerlのLWPでCacheを使う は以上です。