いっしきまさひこBLOG

Web制作関連、プログラミング関連、旅行記録などなど。

MTで人気記事ランキングの定期自動実行

以前のこのブログで書いた「MTで人気記事ランキングを作る」を定期的に自動実行するためのPerlプログラム「MT-MostVisitedプログラム Perl版」を作成しました。人気記事ランキングがどのようなものかというのは、前回の記事を参照してください。(※プログラムは、Jeff Borlik氏の「MT-MostVisited Plugin」を改変したものです。)本プログラムは設置が難しいかもしれません。その点、ご了解ください。

本プログラムは「MT-MostVisitedプラグイン」と同様に、Apacheのログ ファイルが必要になります。よって、WebサーバーでApacheのログ ファイルを使用できない場合は、このプログラムは利用できません。

また、定期実行にCron(Crontabコマンド)を使っています。その他の定期実行ツールが使える場合は、その他のツールでも実行可能かと思いますが、この記事ではCrontabの説明しかしませんので、ご了承ください。

本プログラムで「人気記事ランキング」を自動的に定期更新する仕組みは次のようになっています。

1. Crontabで定期的に「MT-MostVisitedプログラム Perl版(ranking.pl)」を実行する

2. 「MT-MostVisitedプログラム Perl版」はApacheのアクセス ログを解析して順位を決定し、Javascript表示用の「ランキング ファイル(ranking.txt)」を作成する

3. 「人気記事ランキング」を表示したい場所でJavascriptを使って、「ランキング ファイル」を動的に表示する

よって、JavascriptがOFFのブラウザでは参照できないので、ご注意ください。

それでは、「MT-MostVisitedプログラム Perl版」の設定手順を説明します。

手順としては、4つのステップがあります。

ステップ1:アパッチのログ解析モジュールの追加

ステップ2:MT-MostVisitedプログラム Perl版の追加

ステップ3:インデックス テンプレートにJavascriptコードの追加

ステップ4:Crontabの設定

【ステップ1:アパッチのログ解析モジュールの追加】

このステップは「MT-MostVisitedプラグイン」と同じです。Apacheログから人気記事を解析しますので、Apacheログが必要です。これには、Akira Hangai氏が公開しているPerlモジュールを使用します。

(1). まず「Akira Hangai氏のApache::ParseLogのページ」に行って、ページの中にある[Source]と書いているリンクから「ParseLog.pm」をダウンロードしてください。

・「Akira Hangai氏のApache::ParseLogのページ

(2). ダウンロードした「ParseLog.pm」を、Movable Typeディレクトリの「extlib/Apache」の中に入れてください。すると、次のようになります。

(Movable Typeのルート)/extlib/Apache/ParseLog.pm

【ステップ2:MT-MostVisitedプログラムの追加】

(1). 次に「ranking.zip」をダウンロードしてください。

「MT-MostVisitedプログラム Perl版」zip版tar.gz版

※重要:著作権はJeff Borlik氏が所有します。

<特殊ケース>

通常は「Apacheのログファイル名」はこれでOKだと思いますが、私の環境では、「access_log.20031020」のように日付でログが生成されており、固定名が使えませんでした。そこでApacheのログディレクトリの「access_log.XXXXXXXX」のファイルをすべて取得するようにカスタマイズしました。そのログ取得をカスタマイズした「MostVisitedプログラム」も公開しておきます。

ログ取得をカスタマイズした「MT-MostVisitedプログラム Perl版」zip版tar.gz版

※重要:著作権はJeff Borlik氏が所有します。

ただし、Apacheのログ ディレクトリすべてを取得するので十分にご注意ください。ちなみに私は3日分しかログを残していないので、ちょうど3日間分の人気記事ランキングが取得できるようになっています。

(2). ダウロードした「ranking.zip」を解凍してください。解凍したファイルの中に「ranking.pl」というPerlプログラムがあります。

(3). Movable Typeのプラグイン ディレクトリにアップロードする前に「ranking.pl」の中身を編集する必要があります。編集するのは、以下の設定変数です。

「$mthomedir」変数には、Movable Typeがインストールされているディレクトリへのパスを指定します。

「$logdir」変数には、Apacheがログを生成するディレクトリへのパスを指定します。

「$root」変数には、Movable Typeのアーカイブパス(記事のあるディレクトリへのパス)を指定します。

「$filetype」変数は、アーカイブで生成する記事ファイルの拡張子を指定します。通常は「html」のはずです。

「$log」変数は、生成するランキング ファイルのパスを指定します。最終的には、このファイルをJavascriptで表示します。

「$imax」変数は、ランキングで表示する数を指定します。デフォルトは10(=上位10位まで)です。

「@searchfiles」は、Apacheのログファイル名をフルパスで指定します。

<設定例>

my $mthomedir = "/home/www/public_html/blog";

my $logdir = "/var/log/httpd";

my $root = "/blog/archives";

my $filetype = "html";

my $log = "/home/www/public_html/blog/ranking.txt";

my $imax = 10; # default

my @searchfiles = ("$logdir/access_log",

"$logdir/access_log.1",

"$logdir/access_log.2",

"$logdir/access_log.3",

"$logdir/access_log.4",

"$logdir/access_log.5",

"$logdir/access_log.6");

<ランキング ファイルのカスタマイズ>

デフォルトで作成されるJavascriptのファイルをカスタマイズする場合は、次のコメントが書かれている場所をファイル内で検索して探してください。

1. ### Chage output header as you like! ###

 ……ランキング ファイルのヘッダー部分。

2. ### Chage output footer as you like! ###

 ……ランキング ファイルのフッター部分。

3. ### Chage output format as you like! ###

 ……ランキング ファイルのランキング部分。

この部分の文字列を書き換えることでカスタマイズできます。詳細については割愛させていただきます。

<エントリーのタイトルなどが正しく表示されない場合>

my $entry = MT::Entry->load(int $entryid);

my $entry = MT::Entry->load($entryid);

に変えるとうまくいく可能性があります。

これは前回の記事でも書きましたが、データベースの違いがあるかもしれません。

(4). 編集した「ranking.pl」を、任意の場所にアップロードしてください。場所はどこでもかまいませんが、Movable Typeのルート ディレクトリにアップロードすると、次のようになります。

(Movable Typeのルート)/ranking.pl

この段階で、Telnet経由などでコマンド実行して、正常に動作するかどうか確認してください。

上の例では次のようにコマンドします。

perl (Movable Typeのルート)/ranking.pl

すると、「ランキング ファイル(ranking.txt)」が自動的に作成されます。なお、ランキング ファイルが作成される場所は、上記の「$log」変数で指定したパスになります。

【ステップ3:インデックス テンプレートにJavascriptコードの追加】

次に、インデックス テンプレートに、「ランキング ファイル」を表示するための「Javascriptのコード」を書き加えます。

「Main Index(index.html)」にランキングを表示する場合は、サイド メニューの部分に次のコードを追加してください。

<div class="sidetitle">

Last 3 Days Ranking!

</div>

<div class="side">

<script language="javascript" type="text/javascript" src="http://あなたのブログ/ranking.txt"></script>

<noscript>JavaScriptが無効な場合は表示されません。</noscript>

</div>

リビルドして、表示してみてください。正常に人気記事ランキングが表示されれば成功です。

【ステップ4:Crontabの設定】

最後に、Crontabを使って、定期的に「MT-MostVisitedプログラム」が実行されるように設定します。これも先ほどのPerlプログラムの実行と同じように、Telnet経由などでコマンド実行します。

Crontabコマンドでは、Crontabの設定ファイル「例:cronset.txt」(改行コードはLFにする)を作成すると、Crontabコマンドでそのファイルから定期実行の登録を行うことができます。以下のその場合のコマンド実行例です。

crontab cronset.txt

この「cronset.txt」の内容の例を次に示します。

20 5 * * * perl /home/www/ranking/ranking.pl

この例では、毎日5時20分に定期実行するように設定されています。

Crontabの詳細は次のサイトなどを参照してください。

日経Linux - Linuxコマンド逆引き大全 : 定期的にプログラムを動かす

日経Linux : Linuxコマンド集 : crontab

Crontab:作業の自動化