Do You PHP はてブロ

Do You PHPはてなからはてブロに移動しました

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を使った率直な感想です。