MovableTypeで人気記事のランキングを表示するPHPスクリプト:hottopic

Posted by
ぴろり
Posted at
2005/05/26 17:44
Trackbacks
関連記事 (7)
Comments
コメント (10)
Post Comment
コメントできます
Category
MovableType カテゴリ

 Movable Type で構築したサイトで、各記事ごとのアクセス数を集計できれば、"今週の人気記事 トップ 10"のような機能が実現できるでしょう。丁度、ここのホストでも のアクセスログがユーザに解放されているので、これを利用することができそうです。
 結果、特にを追加せず、 を使用することで、サイトの容易性、他ホストでの可搬性を高めつつ、これを実現することができました。また、記事のファイル名がエントリ ID 以外(日付やキーワード)で生成されている場合にも対応でき、cron による定期実行やからのランキング更新も可能です。

この記事をはてなブックマークに追加する この記事のはてなブックマーク数 | この記事をlivedoorクリップに追加する この記事のlivedoorクリップ数 | この記事をYahooブックマークに追加する この記事のYahoo!ブックマーク数 | この記事をdel.icio.usに追加する | Twitterにポストする

経緯

 先ずは、この人気記事ランキングを実現する方法について したところ、"Masahiko Isshiki WEB SITE:MT で人気記事のランキングを表示する" という記事が大変参考になりました。ここでは Jeff Borlik 氏のT-MostVisited Pluginを使用してこれを実現する方法が、インストール手順から詳しく説明されています。このは MT の再構築時にアクセスログの集計と表示を行うためのもので、比較的簡単に導入し実現することができそうです。
 しかしながら、このでは記事ファイル名が記事 ID を含む必要があり、これ以外の書式、例えば日付を基に生成されている場合(/2005/1234_1234.html)などでは、このを使用することができません。これは単純に、アクセスログに残ったファイル名から記事 ID を特定できないことから、その記事のタイトルや投稿者といったにアクセスできないためだと思われます。
 また、ランキングのリアルタイム性を確保するために、これに続く"MTで人気記事ランキングの定期自動実行"で、 のスクリプトを別に用意し を併用する方法が紹介してあります。このように MT 以外のところで様々なギミックが必要となり、結果的にランキング表示周りの複雑性が増すことになっているようでした。

 今回、紹介する方法は以下の点に重点が置かれています。

  • 記事ファイル名が、日付やキーワードなどから生成されていても対応できること
    … ここのサイトが日付による命名ルールになっているので必須
  • gzip 圧縮されたアクセスログにも対応
    … SAKURA Internetのが(以下略
  • できる限り 知識だけで が容易に行えること
    … ランキングは で成形することになりますが、 この部分が だの だのと混合すると判りにくい&編集しにくいため
  • 設置と運用が簡単
    … 簡単に使えて、あとは手間いらずが理想的
  • 軽い
    … MT の再構築はかなり重い処理です。アクセスログの解析や再構築の負荷を上手に分散します。

動作要件

  • 今のところ Movable Type しか考えていません
  • が稼動すること
    … スクリプトが で書かれています。
  • のアクセスログが使用できること
  • または などによるアクセスログが使用できること
    … ログファイルは NCSA コモンログファイル形式に対応しています。 これ以外のログ形式でもスクリプトを編集すればおそらく対応できます。
  • (あれば楽チン) cron などの定期実行がサポートされていること

インストール

 先ずは次のファイルをして適当な場所に解凍してください。 hottopic300.php.tmpl というファイルが 1 つ含まれているハズです。 [ダウンロード]

Step 1. したをインデックスに登録

 したファイルは、 「『アクセスログの集計を行うための スクリプト』のためのインデックス(あぁ、ややこしい)」のため、 このままでは実行できません。 このファイルを MT 管理画面から[]-[インデックス]に登録します。 このの構築を行って初めて、 "出力ファイル名"で指定されたファイルが実行可能な スクリプトとなります。 また"再構築オプション"は"自動で再構築"でも構いません。 再構築時の負荷はマスターアーカイブの生成と同程度と思います。
 この段階で構築はできると思いますが、設定が済んでいないので実行はできないでしょう。 次の各種設定に続きます。

Step 2-1. 環境設定 - 動作設定

 スクリプトの動作設定を行います。の 15〜30 行付近にある以下の項目を修正してください。

nDivDay
集計する期間を日単位で指定します。 スクリプトが実行された瞬間から過去 n 日間のアクセスを集計します。
nTopEntry
集計した結果のうち少なくとも上位 n 件(≠位)をランキングに出力します。 同順位に複数エントリがある場合、その全てを表示します。
szLogDir
のアクセスログが保存されているディレクトリへのパスを指定します。 相対パス指定はしていません。
szOutput
集計結果を出力するファイル名を指定します。相対パス指定はしていません。

Step 2-2. 環境設定 - ログファイル名を指定する

 によってアクセスログのファイル名が様々です。37 行付近の GetLogFileNames という関数内でアクセスログのファイル名を生成しているので、 お使いののアクセスログのファイル名に合わせて修正してください。毎日日付ファイル名でログを残すものや、過去ログを gzip 圧縮するもの、直近の数日のみ残すものなど様々です。
 ログファイルを一つも読めていないような場合は、szLogDir の設定とここの設定を疑ってみてください。

Step 2-3. 環境設定 - 集計対象とするファイル名を指定する

 お使いの MT のによって、個別アーカイブの生成ファイル名は様々かと思います。 76 行付近の IsTargetURL はアクセスログに残されたファイル名が ランキング集計対象か否かを判定するための関数です。 ランキング集計したいファイル名にマッチするよう の正規表現を修正してください。
 スクリプト実行時の標準出力を見て、1 件も集計されいないような場合、 ここのパターンマッチングで失敗していることが考えられます。

Step 2-4. 環境設定 - 集計結果を成形する

 集計結果を成形して書き出すためにCreateEntryListItem(111 行付近) と CreateEntryList(126 行付近) のうち、それぞれ 2 つの /******** ********/ で囲まれた範囲を修正してください。とりあえず動作を見たいという御仁は、このステップを飛ばされても構いません。
 1 つのエントリにつき CreateEntryListItem が呼び出されて、1 つ分の を生成します。 次にこれが nTopEntry 回だけ繰り返されて、 CreateEntryList でその結果を含めた が 生成されるようになっています。
  部分は タグや MT のタグをそのまま使うことができます。 またランキングの集計結果を使う場合は {$entry['キー名']} という記述で値を自由に埋め込むことができます。例えば、次のようにして記述できます。

Step 3. ランキングを集計する

 Step 2.までの設定が終わったら、を再構築してランキング集計スクリプトを書き出します。そして、このランキング集計スクリプトを実行すれば、集計結果が szOutput に出力されます。ランキング集計はこのスクリプトが実行された瞬間に行われます。
 スクリプトを実行する手段として

  • シェルログインしてコマンドラインで実行する
  • cron を使って定期実行する
  • から呼び出す

の何れかの方法が可能です。目的に合わせて適宜選択してください。

Step 4. 集計結果を利用する

 集計結果ファイルはそのまま表示することもできますし、 の include を利用してページに埋め込むこともできます。後々のメンテナンスのことを考えると、集計スクリプトで成形する は最低限にし、それを取り込む側で本格的にを施す方が簡単でしょう。

その他の機能 - エントリの他のが必要になった

 CreateEntryListItemCreateEntryList を成形する場合、 エントリについてさらに細かなが必要になることがあります。 88 行付近の GetEntryList では、 の生成に必要なエントリの各種のテーブルを作成しています。ここに任意の名前でキー名を登録し、タグを駆使してエントリのを取得するようにします。

 この部分は スクリプトとして実行される部分になりますので、encode_php タグ・アトリビュートを指定して、文字列を安全にしてください。


この記事を読んだ人はこんな記事も読んでいます 記事リコメンデーションについて

その他の関連する記事


関連記事/トラックバック (全 7 件中、最新 5 件まで表示しています)

blog Boreal Kiss のスクリーンショット
タイトル
人気記事ランキング設置メモ
Trackbacked at
2007/10/04 16:30
from
blog Boreal Kiss
評価
Web Scouter
概要
<概要> MovableTypeの各記事の人気ランキングを表示する方法。MTのラ...

BITMAP のスクリーンショット
タイトル
人気エントリーのランキングを表示
Trackbacked at
2007/06/04 23:36
from
BITMAP
評価
Web Scouter
概要
当ブログの各エントリーへのアクセスをカウントし、そのランキングを表示させてみた。...

とあるアフィリエイターカップルのおはなし のスクリーンショット
タイトル
人気記事ランキングの追加
Trackbacked at
2006/11/12 02:01
from
とあるアフィリエイターカップルのおはなし
評価
Web Scouter
概要
明日はちぃやんのスピーチの本番なのに、僕は風邪をひきました。 最近は寒くなってきていたので、ちょっと危ないなぁと思っていた矢先に風邪を・・・ (^0^;) 体の...

Project MultiBurst のスクリーンショット
タイトル
人気記事ランキングを設置(再び)
Trackbacked at
2006/10/19 17:34
from
Project MultiBurst
評価
Web Scouter
概要
以前、 「Project MultiBurst:EUCでの人気記事ランキング」 というのをやりましたが、このランキングだとある一定期間のランキングが表示できませ...

りえすけ島ナンデモ日誌 のスクリーンショット
タイトル
人気記事ランキング
Trackbacked at
2006/06/03 02:35
from
りえすけ島ナンデモ日誌
評価
Web Scouter
概要
ここ数日、人気記事ランキングというのをつけようとしてmt-mostvisited...

この記事にトラックバックを送るには?

寄せられたコメント (全 10 件中、最新 5 件まで表示しています)

Posted by
penpen
at
2009/06/18 09:04
ID
A/NnRhDk

こんにちは、ランキングについて質問させて下さい

step3のところでどうしても集計結果の出力ファイルが作成されません。
集計スクリプトを実行したところ、一番下に
(Warning: fopen(/virtual/zox/public_html/review/outrank.php)
[function.fopen]: failed to open stream: Permission denied in
/virtual/zox/public_html/review/rank.php on line 333)
このようなエラーが出てしまいます。

http://zox.s119.coreserver.jp/review/rank.php
↑は集計スクリプトです。

原因が全然分からなくて、すみませんが何かアドバイスを頂けないでしょうか。

Posted by
たくみ
at
2009/06/11 23:42
ID
AqDvDPd.

こんばんは、初めてコメントします。人気ランキングで1つ分からないことがあり、
質問させて下さい><

return (preg_match ("/^ / d{4} / d{2} /( w+)/ .php/", $url));
ここの正規表現の記述がどうしてもわからず、教えて頂きたいのですが、
yyyy/mm/entry-basename/index.php
↑の場合だとどのように記述すればよろしいでしょうか?
お手数ですが、宜しくお願いします。

Posted by
ぴろり ◆OLEEi.VOX.
at
2008/10/28 13:50
ID
kyD4Lst6

>にゃお さん
画面に全く何も出ないというのが謎なんですが,スクリプトファイルの所々に
if (0) /*set 1 for DEBUG*/
という箇所が何箇所かあると思います。これを
if (1)
に書き換えて実行してみてくださいますか?
もしスクリプトとして動いているなら,どこで止まっているのかヒントになるかもしれません。

あと,これは全く自身が無いんですが(ぉぃ) 1行目にある
#!/usr/local/bin/php
を消してみてください。ホント度々すみません。

Posted by
にゃお
at
2008/10/28 11:06
ID
HaU2eNXc

またまたご返信ありがとうございます。

phpinfoで見たところzlib有効になっていました。
う。。。んサーバー側で問題ありなんですかね。。。

Posted by
ぴろり ◆OLEEi.VOX.
at
2008/10/27 20:35
ID
a4WuipxI

>にゃお さん
アクセスログのパスを間違っていたり,正規表現に全くマッチしなかった場合でも,プログラムが動作した場合には何らかのメッセージが表示されるようになっています。それすら表示されずに画面が真っ白ということは,PHP スクリプトとして正しく実行されていないのだと思われます。

ところで,phpinfo() を実行した時に,zlib のサポートが有効になっているか見て頂けますか? このスクリプトではgzip圧縮されたログを読み込む目的のためにzlibの関数を利用しています。

コメントを投稿する

 
 (匿名可/必須/公開)
 (匿名可/必須/非公開)
 (必須)
コメントスパム防止のため投稿前に ランダムな数字 CAPTCHAについて を入力してから投稿してください。お手数ですがご協力のほど宜しくお願いいたします。