wwwcheck.php

HOME | メモ一覧 | LastUpdate: 2007-02-18

説明と環境

Web サイトの更新チェックを行うツールが欲しかったので、PHP で作成してみました。一言で言うと、アンテナのようなものです。個人用として使いやすいように作成しています。それなりにできてきましたので、公開します。もし、何か問題になるようでしたら、このページは削除するかもしれません。

何か問題などがありましたら、メールで指摘をお願いします。


目次

wwwcheck.php 目次

  1. 説明と環境
  2. ダウンロード
  3. 注意事項
  4. 必要な環境
    1. Web サーバ(Apache) と PHP の実行環境
    2. コマンドライン(CLI)版 PHP
    3. diff コマンド、または PECL の xdiff.so
      1. diff コマンドについて
      2. xdiff.so について
    4. PHP の拡張モジュール
  5. 簡単なインストール方法と使い方
  6. スクリーンショット
  7. 詳しい設定方法
    1. ディレクトリ構成
    2. 設定変更
      1. データ保存ディレクトリの移動
      2. SQLite を使用する
      3. PEAR DB を使用する
    3. 出力文字コード設定
    4. コマンドラインからの更新チェック
    5. cron への登録
  8. 仕様、メモなど
    1. 更新日時の取得処理
    2. フィルタについて
    3. ブックマークレット
  9. バージョンアップについて
    1. 0.42 へのバージョンアップ
  10. 更新履歴

ダウンロード

ライセンスは GNU GPL (日本語訳)です。

古いバージョンからバージョンアップする場合は、バージョンアップについてを参照してください。

▲ 目次へ戻る


注意事項

▲ 目次へ戻る


必要な環境

このツールを使用するために、必要な環境、ツールなどです。必須なのは、Web サーバ、PHP の実行環境、mbstring モジュールです。

a. Web サーバ(Apache) と PHP の実行環境

Web サーバ(httpd)として、Apache を想定していますが、他の Web サーバでも動作するかもしれません。

PHP のバージョンは、PHP 4.3.0 以上で動作確認をしています。また、PHP 5.0.1 以降でも動作するようです。PHP は、最近のバージョンでも、セキュリティ問題や多くのバグ修正が行われていますので、できる限り最新版の PHP を使用してください。

b. コマンドライン(CLI)版 PHP

Web ページの取得の際に使用します。

PHP 4.3.0 以上でソースからコンパイルした場合、configure オプションに --disable-cli を指定していなければ、/usr/local/bin/php にインストールされています。Linux ディストリビューションで提供されているパッケージを使用した場合は、/usr/bin/php などにあります。CGI版 PHP でも動作します。

c. diff コマンド、または PECL の xdiff.so

ページの差分取得の際に使用します。設定ページで diff コマンドのパスを設定すると使用します。

diff コマンドが設定されていない場合、PHP 拡張モジュール(PECL)の xdiff.so がインストールされていれば、そちらを使用します。

diff コマンドも xdiff.so もない場合は、PHP で作成した差分取得ライブラリが使用されますが、遅い上に非常に多くのメモリが必要になります。また、memory_limit によるメモリの制限が設定されている場合、正しく差分を取得できませんので、可能であれば、diff コマンドか xdiff.so のどちらかを使用してください。

また、ライブラリの中に含まれている diff.inc.php は pukiwiki 1.4.3 に含まれていた diff.php を高速化のため、一つの関数に書き換えて作成したものです。ほとんど、元の形とは違うものになっていますが、アルゴリズムは同一のものです。

i. diff コマンドについて

Linux や *BSD などの Unix 系の OS では既に存在すると思います。多くの場合、/usr/bin/diff にインストールされています。

Windows の場合、GNU utilities for Win32 などのページで、diff.exe が含まれたコマンド集の配布を行っていますので、その中から取得するなどしてください。

設定ページで以下のようにコマンドが存在するパスを指定してください。

  • Unix 系の OS の場合
    /usr/bin/diff
  • Windows 系の場合
    C:\php\diff.exe
ii. xdiff.so について

xdiff.so を作成するためには、libxdiff をインストールする必要があります。libxdiff のインストール後、pear コマンドでインストールする事ができます。

$ pear install xdiff

d. PHP の拡張モジュール

PHP の拡張モジュールとして、以下を使用します。mbstring 以外は有効になっていない場合でも動作はしますが、制限事項があります。

2005.02.20 の時点で個人的に使用している環境は、以下の通りです。

OS     : Gentoo Linux
Apache : 1.3.33
PHP    : 4.3.10 (DSO + CLI)

PHP の configure オプション

./configure \
    --with-apxs=/usr/local/apache/bin/apxs \
    --enable-mbstring \
    --enable-memory-limit \
    --enable-pcntl \
    --with-curl \
    --with-openssl \
    --with-zlib \
    --without-mysql

▲ 目次へ戻る


簡単なインストール方法と使い方

wwwcheck-<version>.tar.bz2 を Web 上からアクセスできる場所に展開してください。

$ tar jxvfp wwwcheck-<version>.tar.bz2

必要であれば、ディレクトリ名からバージョン番号を削除します。

$ mv wwwcheck-<version> wwwcheck

次に、wwwcheck を展開したディレクトリに data ディレクトリがありますので、Web サーバの動作権限で書き込み可能なように、権限を与えてください(Web サーバ側でファイルに読み込み、書込みの権限があれば、データディレクトリは 707 である必要はありません。適切な所有者、権限を設定してください)。

$ cd wwwcheck
$ chmod 707 data

後は、http://www.example.com/wwwcheck/ など、インストールした場所にブラウザでアクセスして設定を行えば、動作します。最低限の設定というものはありませんが、外部に公開する場合は、ユーザとパスワードの設定は行ってください。また、diff コマンドのパスが分かっている場合は、できれば設定してください。

「アイテムの追加」で目的の Web ページの URI を入力すると、更新チェック対象に追加されます。しばらくした後、更新チェックボタンを押すとチェック対象の URI を取得し、変更があれば表示します。ログインするなどして、管理権限がある場合、項目の詳細設定や更新後、未訪問のページをフィルタリングする機能などが使用できます。

▲ 目次へ戻る


スクリーンショット

▲ 目次へ戻る


詳しい設定方法

細かい設定についての解説です。無視しても問題ありません。

a. ディレクトリ構成

ディレクトリ構成は以下のようになっています。

wwwcheck
   index.php      <-- メインスクリプト
   init.inc.php   <-- 設定、初期化スクリプト
   check.php      <-- 更新チェック実行スクリプト(update.php から呼び出されます。)
   update.php     <-- 更新チェック実行スクリプト

   data           <-- 設定、ログデータ保存ディレクトリ
   lib            <-- 各種ライブラリ
   misc           <-- デバッグ、初期化補助スクリプト集
   view           <-- HTML テンプレートファイル
   css            <-- スタイルシートファイル

b. 設定変更

i. データ保存ディレクトリの移動

設定、初期化ファイルの init.inc.php を編集することで、データ保存ディレクトリの位置などが変更可能です。特にデータディレクトリは、デフォルトのままでは、外部からアクセスされる可能性などもありますので、Web 上からアクセスできない別の場所に移動させておく方が安全です。

例えば、設定、ログデータ保存ディレクトリを上位ディレクトリに移動し、wwwcheck_data というディレクトリにしたい場合は、以下のようにディレクトリを移動した後、init.inc.php を編集します。

$ cd wwwcheck
$ mv data ../wwwcheck_data
$ vi init.inc.php

init.inc.php の $data_dir 定数の定義の部分を

$data_dir      = $self_dir . 'data/';

以下のように変更します。

$data_dir      = $self_dir . '../wwwcheck_data/' );
ii. SQLite を使用する

wwwcheck.php 0.2 以降ではデータ保存に、SQLite を使用できます(全てのデータを SQLite に保存するわけではありません)。デフォルトのファイルによる保存は、更新チェックを行う件数が増えると、速度が落ちていきますが、SQLite を使用すると、速度の問題はかなり改善されます。

SQLite は、PHP4 では PECL として提供されています(PHP5 からは、PHP 内に組み込まれています)。Unix 系の OS では、インストールは以下のように、pear コマンドを使用してください(pear コマンドの実行には root 権限が必要です)。Windows でも SQLite は使用できるようですが、試していませんので説明は省略します。

$ sudo pear install sqlite

SQLite をインストールした後、テーブルの作成とファイルに保存されているデータの変換を行います。以下のコマンドを実行してください。

$ php /home/user/public_html/wwwcheck/misc/SQLite/createdb.php

コマンドの実行が終わると、データ保存ディレクトリの item ディレクトリの下に、SQLite 用のデータベース(data.sqlite)が作成されています。

次に、init.inc.php の以下の行を変更してください。

define( 'SAVE_HANDLE',  'File' );

以下のように、File になっている部分を SQLite に変更します。

define( 'SAVE_HANDLE',  'SQLite' );

SQLite データベースを作成すると、data/item ディレクトリにある、http から始まるファイルは不要になりますので、削除しても問題ありません。

もし、データの管理を SQLite から File に戻したい場合、以下のコマンドを実行することで SQLite データベースの内容を File の形式に戻すことができます。

$ php /home/user/public_html/wwwcheck/misc/SQLite/dumpfile.php
iii. PEAR DB を使用する

ほぼ、SQLite と同じように、PEAR DB を使用することもできるようにしたのですが、あまりテストしていない上に、SQLite と PostgreSQL しか動作を確認していません。不具合がある可能性がありますので、バグ修正できる自信がない場合はあまり使用しない方が良いと思います。

PostgreSQL を使用する場合、wwwcheck という名前のデータベースを作成し、テーブル作成スクリプトを実行します。データベースの文字コードは UTF-8 にしてください。

$ createdb -E UTF-8 wwwcheck
$ php /home/user/public_html/wwwcheck/misc/PEAR_DB/createdb.php

次に、init.inc.php の以下の部分で、SAVE_HANDLE の定数を PEAR_DB に変更し、DSN を記述してください。

define( 'SAVE_HANDLE',  'PEAR_DB' );
if ( SAVE_HANDLE === 'PEAR_DB' ) {
    define( 'DSN', 'pgsql://user:pass@unix()/wwwcheck' );
}

データの管理を PEAR_DB から File に戻したい場合、以下のコマンドを実行します。

$ php /home/user/public_html/wwwcheck/misc/PEAR_DB/dumpfile.php

c. 出力文字コード設定

初期設定では、出力される文字コード設定は UTF-8 になっていますが、変更することも可能です。

init.inc.php の以下の個所の $mb_output_enc を変更してください('UTF-8' の部分を書き換えるのではなく、$conf 以降の部分を削除して書き換えてください)。

$mb_output_enc = $conf->get( 'mb_output_enc', 'UTF-8' );

d. コマンドラインからの更新チェック

コマンドラインから更新チェックを行うことも可能です。コマンドライン(CLI)版 PHP で update.php を実行してください。

$ php update.php

ただし、ファイルの所有者の違いによるデータの書込み権限については注意してください。

e. cron への登録

cron への登録を行い、定期的に更新チェックを行うには、以下のように、crontab -e コマンドで登録します。

一日一回、午前 6時に更新チェックを行う場合は以下のように登録します( /home/user/public_html/wwwcheck/ にインストールしている場合)。

00 06 * * * /usr/local/bin/php /home/user/public_html/wwwcheck/update.php

コマンドラインから実行するため、実行ユーザについては、十分に気をつけてください。データ保存ディレクトリに書き込み権限がないユーザが実行した場合、エラーが発生します。

▲ 目次へ戻る


仕様、メモなど

仕様や分かりにくい部分についてメモしておきます。この部分も無視して問題ありません。

a. 更新日時の取得処理

静的なページの場合、HTTPD が出力する HTTP のレスポンスヘッダに Last-Modifed が付いていることが多いのですが、動的に生成されるページでは、Last-Modifed が含まれていることはあまりありません。また、一部のページでは、変更などはない場合でもアクセスした時間を Last-Modifed として出力することがあるようです。このため、動的に生成されたページの場合、正確な更新日時を取得することはできません。

このツールでは、更新日時は以下のように取得しています。更新日時の取得処理が気になる場合は参考にしてください。ただし、今後、この処理は変更される可能性があります。

  1. HTTP ヘッダに Last-Modifed が含まれていた場合
    • 初回時、または、前回に取得したページ内容から変更がある場合は HTTP ヘッダに含まれていた Last-Modifed の時間を更新日時とする。

    • 前回に取得したページ内容から変更がない場合、前回取得した更新日時を今回の更新日時とする(更新時間を変更しない)。もし、前回取得した更新日時が正しく取得できなかった場合、前回にアクセスし、ログを保存した時間を更新日時とする。

  2. HTTP ヘッダに Last-Modifed が含まれていなかった場合、または、含まれていたが、正しく更新時間を取得できなかった場合
    • 初回時、または、前回に取得したページ内容から変更がある場合はアクセス時(HTTP ヘッダの Date)を更新日時とする。HTTP ヘッダに Date が含まれていない場合、現在の時間を更新日時とする。

    • 前回に取得したページ内容から変更がない場合、前回取得した更新日時を今回の更新日時とする(更新時間を変更しない)。もし、前回取得した更新日時が正しく取得できなかった場合、前回にアクセスし、ログを保存した時間を更新日時とする。ログからの時間が何らかの原因で取得できなかった場合、現在の時間を更新日時とする。

b. フィルタについて

広告などを削除した後に、ページが更新されたかを判断することができるようにするために、フィルタを設定することができます。パターンにマッチした URI と、取得した文書の中でマッチしたフィルタパターンを削除することになっていますが、Perl 互換の正規表現を書くのは難しいかもしれません。分からない場合は、使わない方が安全です。

c. ブックマークレット

以下のようなブックマークレットをブックマークに登録しておくと、現在表示しているページの登録がを簡単にできます(ホスト名とパス名は環境に応じて変更する必要があります)。ブックマークレットについては、はてなダイアリーのブックマークレットの説明を参照してください。

javascript:document.location='http://localhost/wwwcheck/?mode=config&link='+escape(document.location)

▲ 目次へ戻る


バージョンアップについて

基本的には以下のどれかの方法でバージョンアップを行ってください。

a. 0.42 へのバージョンアップ

上記の方法でバージョンアップを行ってください。

▲ 目次へ戻る


更新履歴

2007.02.18

  • バージョンを 0.5 を公開
    • セキュリティ問題の見直しを行いました。

      • register_globals が有効になっている場合、ライブラリを直接狙ってクロスサイトスクリプティングが可能だった問題を修正しました。

      • 潜在的にセキュリティ問題がありそうな部分について修正を行いました。

    • RSS 1.0 を出力可能にしてみました。

    • 細かいバグ修正など。

2006.05.07

  • バージョンを 0.43 を公開
    • 致命的なバグ(更新チェック実行時に、URI に & が含まれている登録サイトの & 以下が削除されてしまう問題)を修正しました。報告してくださった方、どうもありがとうございました。

2005.11.25

  • バージョンを 0.42 を公開
    • クロスサイト・スクリプティングが可能でしたので該当部分のコードを修正しました。

    • その他、細かいバグの修正と問題がありそうなコードの修正を行いました。

    • 使用していないファイルを削除しました。

2005.07.17

  • バージョンを 0.41 を公開
    • PHP 4.4.0 で修正されたリファレンス関連のバグの関係で、大量のエラーが表示されるようになってしまいましたので、エラーが発生する部分のコードを修正しました。

    • CSRF 処理を修正し、複数のウインドウを開いていても処理が続けられるようにしました。

    • その他、細かいバグ修正を行いました。

2005.03.20

  • バージョンを 0.4 を公開
    • HTTP ヘッダに ETag フィールドが含まれていた場合、次の更新チェック時に、"If-Modified-Since" と "If-None-Match" を HTTP のリクエストヘッダに含めるようにしました。ETag を出力するページで、前回のチェック時から更新がないページの取得が高速になります。

    • 設定画面で HTTP のレスポンスヘッダのステータスコード一覧を表示する「ステータス一覧」ページを追加しました。

    • 設定画面の「表示・デフォルト値設定」で表示期間、訪問後の項目についてのデフォルト値設定を変更できるようにしました。

    • その他、バグ修正などを行いました。

2005.02.20

  • バージョンを 0.3 を公開
    • CSRF 問題への対処を行いました。

    • 設定画面の変更を行いました。

    • 一覧表示での表示期間の選択フォームを追加しました。

    • 以前のバージョンを削除しました。

2004.11.07

  • バージョンを 0.2a を公開
    • デザイン変更を行いました。

    • スタイルシートの選択機能を追加を追加しました。

    • いくつかのバグ修正を行いました。

2004.09.26

  • バージョンを 0.2 を公開
    • ドキュメントを書きました

2004.04.11

  • バージョンを 0.1d に更新

2004.04.04

  • バージョンを 0.1c に更新
    • ドキュメントは全然進んでいません。

2004.03.28

  • バージョンを 0.1b に更新
    • ドキュメントは作成中です。

2004.03.22

  • バージョンを 0.1a に更新

2004.03.14

  • 初版作成

▲ 目次へ戻る

LastUpdate: 2007-02-18 | メモ一覧 | HOME