HTML_TagCloud+awstatsでKeywordCloud
何てことないんですが、awstatsの集計結果ファイルから検索文字列(キーワード)を抜き出して、cloud形式に表示するスクリプトを書いてみました。
。。。と理由は付けてますが、まあ、HTML_TagCloud使いたかっただけです ;-)
結果はDo You PHP?のEXPERIENCEからどうぞ。ちなみに、Cache_Liteを使って、24時間データを保存するようにしています。
<?php
ini_set('error_reporting', E_ALL);
require_once 'HTML/TagCloud.php';
require_once 'Cache/Lite.php';
define('DATA_PATH', '/path/to/awstats/');
define('FILE_PREFIX', 'awstats');
define('FILE_SUFFIX', '.txt');
define('CACHE_DIR', '/path/to/place/your/cache/file/');
define('CACHE_TTL', 60*60*24);
?>
<?php
$yesterday = time() - (60 * 60 * 24);
$datafile = DATA_PATH . FILE_PREFIX . date('mY', $yesterday) . FILE_SUFFIX;
$id = 'tagcloud';
$options = array('cacheDir' => CACHE_DIR, 'lifeTime' => CACHE_TTL);
$cache = new Cache_Lite($options);
if ($data = $cache->get($id)) {
echo $data;
exit;
}
$fp = fopen($datafile, 'r');
if ($fp) {
while (!feof($fp)) {
$line = fgets($fp, 4096);
if (preg_match('/^BEGIN_KEYWORDS /', $line)) {
break;
}
}
$cloud = new HTML_TagCloud();
while (!feof($fp)) {
$line = fgets($fp, 4096);
if (preg_match('/^END_KEYWORDS/', $line)) {
break;
}
preg_match('/(.*) (.*)/', $line, $matches);
if (isset($matches[1]) && isset($matches[2]) && $matches[2] > 30) {
$keyword = mb_convert_encoding(urldecode($matches[1]), mb_internal_encoding(), 'auto');
$count = $matches[2];
$cloud->addElement($keyword, null, $count);
}
}
$data = $cloud->buildAll();
echo $data;
$cache->save($data);
}
fclose($fp);「クラウド」って、要は出現頻度をグラフや表ではなく、文字の大小で表しているところがポイント(ある種の「見える化」)なので、タグに限らず何でも使えそう。。。というのが、HTML_TagCloudを使った率直な感想です。