天気予報の更新が遅れる場合があることに気づきました。MTWeatherは1.0になって、天気情報をローカルにキャッシュするのですが、このキャッシングのロジックに問題があるためだとわかりました。天気情報はdrk7.jpから配布されているので、アクセス頻度が変わらないように留意しながら問題を修正しました。
オリジナルのキャッシュロジックは、次のようになっていました。- 現在時刻が日本時間で00:00〜06:00ならば更新しない。
- キャッシュファイルが作られたのが、日本時間でその日の06:00以降なら更新しない。
- 前回更新が前々日以前で、現在時刻が00:00〜06:00ならば本来更新が必要なのにしない。
- 実際には、ここ数日は06:30前後にデータの更新が行なわれているため、06:00〜06:30の間に更新すると、前日のデータを今一度キャッシュすることになり、それが翌日の6時以降の更新まで残る。
以上の問題を回避するために、キャッシュのロジックをざっくりと直しました。この方法は非常にシンプルです。データの生成時刻はXMLに含まれているので、そこから取得します。ファイルの生成時刻ではありません。そして、データが生成されてから24時間経過していたらキャッシュを更新に行きます。何らかの事情でdrk7.jp側でデータの生成が行なわれないと、以後の生成ごとにアクセスが発生するところがオリジナルと違うところですが、データの提供が行なわれている限りは問題がないでしょう。
38: use Date::Manip qw(ParseDate DateCalc); # この行を挿入
304行付近から:
sub _load_cache {
my($args, $xmluri, $pref) = @_;
my $xml = '';
# 最新のXMLキャッシュがあればそれをロード
if(-e $xmluri->{$pref}) {
my $fh = FileHandle->new($xmluri->{$pref});
if ($fh) {
while(<$fh>) { $xml.=$_; }
close($fh);
}
my $xmlref = XMLin($xml);
my $pubDate = ParseDate($xmlref->{pubDate});
my $expire = DateCalc($pubDate, "+ 1 days");
my $diff = DateCalc($expire, "now");
$xml = '' if $diff =~ /^\+/;
}
return $xml;
}
304行付近から:
sub _load_cache {
my($args, $xmluri, $pref) = @_;
my $xml = '';
# 最新のXMLキャッシュがあればそれをロード
if(-e $xmluri->{$pref}) {
my $fh = FileHandle->new($xmluri->{$pref});
if ($fh) {
while(<$fh>) { $xml.=$_; }
close($fh);
}
my $xmlref = XMLin($xml);
my $pubDate = ParseDate($xmlref->{pubDate});
my $expire = DateCalc($pubDate, "+ 1 days");
my $diff = DateCalc($expire, "now");
$xml = '' if $diff =~ /^\+/;
}
return $xml;
}
コメント