別サーバのファイル最終更新日を取得するには?

[上に] [前に] [次に]
ちぃ [E-Mail] 1999/07/16(金) 07:07:28
サーバを二つ利用しています。
あちらとこちらのファイルの更新状況を一つのページに表示するにはどうしたらよいでしょうか?
片方はCGI,SSIは使用できません。片方は出来ます。

ふじ 1999/07/16(金) 14:55:59
CGI,SSIを使えるサーバを A 、使えない方を B とすると、
A は B の更新状況を知れますが、B は A の更新状況は知れません。

方法ですが、
HTTP で更新状況を知りたいファイルについて HEAD をリクエストして、
返ってきたヘッダの Last-Modified を解析して表示する、
というスクリプトを A に置いて、CGIなりSSIなりで使えばよろしいかと。
#PerlならLWPを使うか、HTTPダウンローダをどっかから拾って来れば
#自分でソケットいじらなくても出来るでしょう。

ただし、Last-Modified が必ず返って来るとは限らないようです。
返って来ない場合は使えません。

ちぃ [E-Mail] 1999/07/16(金) 22:21:29
ありがとうございます。しかし,当方初心者につき,よくわかりません。
($mtime) = (stat('filename'))[9];
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($mtime);
このようにしましたが,同一サーバのファイルの更新日は表示されますが,別のサーバのものは表示されません。
'filename' は 'http://www.xxx.or.jp/homepage/xxx.html' と書きました。
さらに詳しく教えていただければ幸いです。

zizz... [HomePage] 1999/07/16(金) 22:39:45
stat はローカルのファイルの属性を調べる関数です。
URLを入れてもファイルを取りに行ってくれません。

libwwwを使うといいでしょう。
LWP::Simple
のhead($url) で
($content_type, $document_length, $modified_time, $expires, $server)
が返って来ます。

zizz... [HomePage] 1999/07/16(金) 22:43:09
補足。

LWP::Simple
に関しては
CPANのドキュメントに書いてあります。(英語)
ミラーサイトを一つ挙げておきます。
http://www.ring.gr.jp/archives/lang/perl/CPAN/doc/wwwman/libwww/lib/LWP/Simple.html

ふじ 1999/07/16(金) 23:14:24
LWP::Simple が使えるなら、

use LWP::Simple;

($content_type, $document_length, $modified_time, $expires, $server) = head "http://www.hoge/fuga.html";
($sec, $min, $hour, $day, $mon, $year) = localtime($modified_time);
$year += 1900;
$mon ++;

こんな感じ。

ちぃ [E-Mail] 1999/07/17(土) 04:43:50
毎度ありがとうございます。
試してみたところ,Internal Server Error が出ました。
ちなみにサーバは,Apache/1.3.6 Server です。
さらに,良いお考えをお聞かせください。

B-Cus 1999/07/17(土) 05:31:14
Internal Server Errorが出たら、その原因を追求するのが筋でしょう。
ローカルで試しました? ログを見ました? evalしました?
 eval("use LWP::Simple");
 print $@;
そもそもLWPをインストールしてありますか?

なお、libwwwと共に
 HTML-Parser
 MIME-Base64
 Net
の各モジュールを入れてもらうとさらに便利になります。

ところでLWPいいっすね。http/ftpのリンクチェッカが数行で書けた
(リクエスト部分だけね)。ただ、他の人に簡単に勧められないのが欠点。
たいていのプロバイダにはモジュールが入ってないから。

> さらに,良いお考えをお聞かせください。
良くないお考えなら。

 $addr = (gethostbyname("www.xxx.zzz"))[4];
 $name = pack("S n a4 x8", 2, 80, $addr);
 socket(S, 2, 1, 0);
 connect(S, $name);
 select(S); $| = 1; select(stdout);
 print S "HEAD /index.html HTTP/1.0\n\n";
 while (<S>){
  if ( m/^last-modified: (.*)/i ){
   $last_modified = $1;
  }
 }
 close(S);
 # http://www.tohoho-web.com/wwwperl2.htm#socket

URL解析も、URLエンコードも、タイムアウト処理も、エラー処理も、
3xxが返ってきたときの処理も全部自分でやるわけ。ちょー面倒。

ちぃ [E-Mail] 1999/07/17(土) 06:05:31
すみません。初心者なもので,勘弁してください。
perlのコマンドかなんかだと思ってたものですから・・・・・
チェックの仕方もわからないド素人です。
「そんなやつは,CGIを使うな!」なんて言わないでくださいね。
引き続き試してみます。親切なご指導に感謝します。

[上に] [前に] [次に]