NAME

DLC
ファイルのダウンロード数をカウント

SYNOPSIS


DESCRIPTION

いわゆるダウンロードカウンタです。 ダウンロードさせたいファイルの URL へ転送する方式と、 ファイルを実際に読み出して渡す方式が選べます。

本スクリプトはまた、dlc.cgi から DLC.pm にリネームする事で、 ダウンロードカウンタを作成する為の Perl モジュールとしても利用できます。


SETUP

  1. 本スクリプト (dlc.cgi) の先頭に書かれている perl(1) のパスを確認し、もし必要ならば変更して下さい。

    #!/usr/bin/perl

  2. 本スクリプト内に書かれている設定項目 (後述) を、 設置環境や好みに合わせて適宜変更して下さい。

  3. 各ファイルを設定内容に合わせて置いて下さい。

    カウントファイルは自動的に作成する事も可能です。 その場合、カウントファイルを置くディレクトリには書込権限が必要です。 書込権限がなければ、ファイルを予め用意する必要があります。

    ロックファイルは本スクリプトが作成します。 ロックファイルを置くディレクトリには必ず書込権限が必要です。

本スクリプト内に以下の設定項目があるので、必要があれば変更して下さい。

$Conf

ダウンロードさせるファイルの設定と、それを呼び出す為のキーの対応表です。

$Conf = {
    KEY => {
        location   => 'http://domain.tld/~you/archive/foo.zip',
        count_file => '/home/you/var/foo.count',
        lock_file  => '/home/you/var/foo.lock',
    },
};
    
KEY
設定のセットを呼び出す為のキーです。 正規表現 [!\$&-;=?-Z_a-z~]+ にマッチする文字列のみが利用可能です。
archive
ダウンロードさせるファイルのパスです。 ドキュメントルート外に置いても構いません。 location を同時に指定した場合、 archive は無視されます。
count_file
ダウンロード数のカウンタファイルです。 省略すると archive に拡張子 .count を付けたファイルが設定されます。 location を指定した場合は省略不可です。
location
ダウンロードさせるファイルの URL です。 location を省略した場合、 archive は省略不可です。
lock_file
ロックファイルです。 省略すると count_file に拡張子 .lock を付けたファイルが設定されます。
mime_type
ダウンロードさせるファイルの MIME type (Internet Media Type) です。 省略した場合は、 スクリプト内部で定義されている拡張子については対応する MIME Type が、 定義されていない拡張子については application/octet-stream が、 それぞれ指定されます。
$LockRefresh

デッドロックした際に自動で解除するまでの時間 (単位: 秒) です。 0 を指定すると自動解除は行いません。 デフォルトでは 300 秒です。

%MimeType

拡張子と MIME Types (Internet Media Types) の対応表です。 拡張子は全て小文字で指定して下さい。

ここに無い拡張子のファイルは、 Default に設定された MIME Type を使用します。


RUN

$Conf に設定した KEY をクエリに与えて呼び出すと、 count_file の値をカウントアップ後、 location の URL へリダイレクトするか、 archive のファイルをクライアントに送ります。

KEY を省略した場合、 $Conf にキーが一つしか定義されていない場合はその設定を、 二つ以上存在する場合はキー Default の設定を利用します。


DLC CLASS

この章は本スクリプトをモジュールとして利用する場合のリファレンスです。 通常の CGI プログラムとしてのみ利用する方は読み飛ばして構いません。


SYNOPSIS AS MODULE

use DLC;
$obj = DLC->new              or DLC->end($@);
$obj->load_conf($file, $key) or $obj->end;
$obj->count_up               or $obj->end;
$obj->send                   or $obj->end;
exit;

CONFIG FILE

モジュールとして利用する場合、 本ファイル上の $Conf による設定は利用できません。 上記例のようにインスタンスメソッド load_conf によって外部ファイルから設定を読み込むか、 コンストラクタ new の引数に必要な設定を全て指定する事になります。

外部ファイルは require された時に $Conf と同様のハッシュリファレンスを返すよう作られている必要があります。 最も単純な設定ファイルの内容は以下の様になります;

{
    key1 => {
        ...
    },
    key2 => {
        ...
    },
};

PROPERTIES

本クラスのオブジェクトは以下のインスタンス属性を持ちます。

KEY DEFAULT
error undef
location undef
lock_refresh $LockRefresh
mime_type $MimeType{'Default'}
use_flock undef
archive_dir undef
archive_name undef
count_file_dir archive_dir の値
count_file_name archive_name の値 + .count
lock_file_dir count_file_dir の値
lock_file_name count_file_name の値 + .lock
archive_size undef
lock_key undef

METHODS

コンストラクタ new 以外は全てインスタンスメソッドです。

count_up

count_up

カウントファイルの値をインクリメントします。 何らかのエラーが起こった場合は偽値を返します。

new

new([KEY => VALUE [, KEY => VALUE [...]]])

コンストラクタです。 生成するインスタンスに持たせる属性値を引数に与える事ができます。

何らかのエラーが起こった場合は $@ にエラーメッセージをセット後、偽を返します

load_conf

load_conf(FILE [, KEY])

外部ファイル FILEKEY から設定を取り出し、 自身の属性値に定義します。KEY を省略した場合、 FILE にキーが一つしか定義されていない場合はその設定を、 二つ以上存在する場合はキー Default の設定を利用します。

lockup

lockup([OPERATION])

unlock が呼び出されるまで排他的ロックを行います。

インスタンス属性 use_flock に真値が定義されている場合、lockup は組込関数 flock に対するラッパーとなり、 OPERATIONflock に渡されます。

$self->use_flock(1);
$self->lockup(1);
...               # 共有ロック
$self->unlock;
$self->lockup(6);
...               # ブロックしない排他的ロック
$self->unlock;
    
send

send

ダウンロードさせるファイルをクライアントに渡します。 何らかのエラーが起こった場合は偽値を返します。

unlock

unlock

ロックを解除します。


ACCESS METHODS

以下に挙げる関数は、 同名のインスタンス属性に対する読み書き両用のアクセスメソッドです。

$obj = $obj->method($value);
$value = $obj->method;

archive

archive([FILE])

インスタンス属性 archive_dirarchive_name を同時に扱うアクセスメソッドです。 パス付きファイル名を指定して下さい。

ファイルの読込権限が無い場合は偽を返します。 location 属性が空でない場合は常に偽を返します。

archive_dir

archive_dir([DIR])

アーカイヴを置くディレクトリです。 ディレクトリの実行権限が無い場合は偽を返します。

location 属性が空でない場合は常に偽を返します。

archive_name

archive_name([FILENAME])

アーカイヴのファイル名です。 ファイルの読込権限が無い場合は偽を返します。

location 属性が空でない場合は常に偽を返します。

archive_size

archive_size

アーカイヴのファイルサイズです。 このメソッドは読み出し専用です。

location 属性が空でない場合は常に偽を返します。

count_file

count_file([FILE])

インスタンス属性 count_file_dircount_file_name を同時に扱うアクセスメソッドです。 パス付きファイル名を指定して下さい。

count_file_dir

count_file_dir([DIR])

カウントファイルを置くディレクトリです。 ディレクトリの実行権限が無い場合は偽を返します。

count_file_dir 属性に値が定義される前に読み出した場合、 archive_dir 属性と同じ値が定義されます。

count_file_name

count_file_name([FILENAME])

カウントファイルのファイル名です。

count_file_name 属性に値が定義される前に読み出した場合、 archive_name 属性の値に拡張子 .count をつけた値が定義されます。

error

error([LIST])

エラーメッセージです。 LIST を連結し、末尾に error が呼び出された行番号を追加した文字列が定義されます。

location

location([URL])

ダウンロードさせるファイルの URL です。 指定した URL が正しい absoluteURI (RFC 2396 参照) で無かった場合は偽を返します。

lock_file

lock_file([FILE])

インスタンス属性 lock_file_dirlock_file_name を同時に扱うアクセスメソッドです。 パス付きファイル名を指定して下さい。

lock_file_dir

lock_file_dir([DIR])

ロックファイルを置くディレクトリです。 ディレクトリの書込権限が無い場合は偽を返します。

lock_file_dir 属性に値が定義される前に読み出した場合、 count_file_dir 属性と同じ値が定義されます。

lock_file_name

lock_file_name([FILENAME])

ロックファイルのファイル名です。

lock_file_name 属性に値が定義される前に読み出した場合、 count_file_name 属性の値に拡張子 .lock をつけた値が定義されます。

lock_refresh

lock_refresh([EXPR])

デッドロックした際に自動で解除するまでの時間 (単位: 秒) です。 0 を指定すると自動解除は行いません。 デフォルトでは $LockRefresh 秒です。

mime_type

mime_type([MIMETYPE])

ダウンロードさせるファイルの MIME Type (正確には Internet Media Type (RFC 2045 及び RFC 2616 参照)) です。 指定した MIMETYPE が正しい書式で無かった場合は偽を返します。

mime_type 属性に値が定義される前に読み出した場合、 archive 属性が既に定義されていればそのファイルの拡張子に応じた MIME Type が、 定義されていないか判別できなければ $MimeType{'Default'} が、それぞれ定義されます。

use_flock

use_flock([EXPR])

本モジュールでは通常 Perl の組込関数 rename を用いた排他処理を行いますが、 この属性に真値を定義すると、 排他処理に flock を用います。 ロックファイルとカウントファイルを共用する事が可能になります。

flockNFS 越しだと有効に働かない事と、 実装されていないプラットフォームが存在する事を理解した上で使用して下さい。


FUNCTIONS

以下に挙げる関数は、メソッドとして呼び出す事も、 通常の関数として呼び出す事もできます。 また use 時に輸入リストに加える事ができます。

end

end([LIST])

LIST を連結した文字列を表示する HTTP レスポンスメッセージを STDOUT に出力し、exit します。

インスタンスメソッドとして呼び出した場合、 LIST が省略されていれば error 属性の値を用います。

is_valid_absolute_uri

is_valid_absolute_uri(ABSOLUTEURI)

文字列 ABSOLUTEURI が RFC 2396 の 3. URI Syntactic Components で定義されている absoluteURI にマッチするか調べ、真偽値を返します。

is_valid_media_type

is_valid_absolute_uri(MEDIATYPE)

文字列 MEDIATYPE が RFC 2616 の 3.7 Media Types で定義されている media-type にマッチするか調べ、真偽値を返します。

unify_dir_delimiter

unify_dir_delimiter(PATH)

PATH のディレクトリ区切り文字を / に統一した文字列を返します。 PATH./ で始まらない場合は、 先頭に ./ を付加します。


SEE ALSO


BUGS


AUTHORS

一次配布元:
BYOR

本スクリプトは修正 BSD ライセンスにて公開されています。


HISTORY

v0.0.1 / 2002.11.13.
初版公開。

Top