対象サーバについて
製品名 | OpenBlockS 600 |
OS(kernel ver) | Debian lenny(2.6.29) |
CPU | 600MHz(AMCC PowerPC 405EX) |
メモリ | 1GB(DDR2 SDRAM) |
ストレージ | 8GB(Compact Flash) |
bbcloneについて
見た目重視のWebアクセス解析ソフトです。
アクセス時に無駄な計算が走るので(本ページ末尾に原因の調査結果を記載しています。)パワーの無いPCにはお勧めできませんが、見た目は図の通り非常に美しいソフトです。
bbcloneのダウンロード
www:/var/www/example# wget http://www.bbclone.de/dist/utf8/bbclone-0.4.9b-utf8.tar.gz --2010-02-21 02:47:32-- http://www.bbclone.de/dist/utf8/bbclone-0.4.9b-utf8.tar.gz www.bbclone.de をDNSに問いあわせています... 217.234.191.112 www.bbclone.de|217.234.191.112|:80 に接続しています... 接続しました。 HTTP による接続要求を送信しました、応答を待っています... 200 OK 長さ: 1257027 (1.2M) [application/x-gzip] `bbclone-0.4.9b-utf8.tar.gz' に保存中 100%[============================================================>] 1,257,027 44.9K/s 時間 39s 2010-02-21 02:48:12 (31.2 KB/s) - `bbclone-0.4.9b-utf8.tar.gz' へ保存完了 [1257027/1257027]
続けてtar.gzを解凍します。
www:/var/www/example# umask 0 www:/var/www/example# tar xzvf bbclone-0.4.9b-utf8.tar.gz bbclone/ bbclone/css/ bbclone/css/bbclone.css bbclone/doc/ bbclone/doc/options.txt bbclone/doc/install.txt : bbclone/show_time.php www:/var/www/example# umask 022
apache側の設定を追加します。
www:/var/www/example# vi /etc/apache2/sites-available/01-example <Directory "/var/www/example/bbclone"> Order allow,deny allow from 192.168.0.0/255.255.255.0 </Directory>
bbcloneの設定
www:/var/www/example# vi bbclone/conf/config.php
$BBC_MAINSITE = "..";$BBC_MAINSITE = "http://www.example.jp";$BBC_LANGUAGE = "en";$BBC_LANGUAGE = "jp";$BBC_DETAILED_STAT_FIELDS = "id, time, ext, dns, visits, os, browser, referer";$BBC_DETAILED_STAT_FIELDS = "id, time, ext, ip, dns, visits, referer, search, os, browser, page";
最後の$BBC_DETAILED_STAT_FIELDSでアクセスログの情報を増やしています。
次に権限を修正します。
www:/var/www/example# cd bbclone www:/var/www/example/bbclone# chmod 777 var www:/var/www/example/bbclone# cd var www:/var/www/example/bbclone/var# chmod 666 *.inc *.php .htalock
apacheを再起動します。
www:/var/www/example/bbclone/var# /etc/init.d/apache2 restart Restarting web server: apache2 ... waiting .
Webコンテンツ側にアクセス解析用の設定追加
通常のphpコンテンツの場合
通常のphpファイルの場合は以下のコンフィグをファイル末尾にコピーするだけで終了です。
[ページの名前]のところには任意のサイト名に、/var/www/example/bbclone/のところはbbclone設置パスに置き換えて下さい。
<?php define("_BBC_PAGE_NAME", "[ページの名前]"); define("_BBCLONE_DIR", "/var/www/example/bbclone/"); define("COUNTER", _BBCLONE_DIR."mark_page.php"); if (is_readable(COUNTER)) include_once(COUNTER); ?>
Nucleusの場合
Nucleusにbbcloneを設置する方法を記載します。
日本語サイトも以前はあったようですが、リンク切れしていたので他に無いか探してみたところ、海外のNucleus Forumで見つけましたので共有します。
まず、Nucleusと同じ階層(当サイトの場合は/var/www/example/)にbbclone.phpという名前で以下のようにファイルを作成します。
www:/var/www/example# vi bbclone.php <?php // I do not have $_SERVER['REQUEST_URI'] working... so this is how I get it... $_SERVER['FULL_URL'] = 'http'; if($_SERVER['HTTPS']=='on'){$_SERVER['FULL_URL'] .= 's';} $_SERVER['FULL_URL'] .= '://'; if($_SERVER['SERVER_PORT']!='80') $_SERVER['FULL_URL'] .= $_SERVER['HTTP_HOST'].':'.$_SERVER['SERVER_PORT'].$_SERVER['SCRIPT_NAME']; else $_SERVER['FULL_URL'] .= $_SERVER['HTTP_HOST'].$_SERVER['SCRIPT_NAME']; if($_SERVER['QUERY_STRING']>' '){$_SERVER['FULL_URL'] .= '?'.$_SERVER['QUERY_STRING'];} // convert URI string to lowercase $string_referrer = strtolower($_SERVER['FULL_URL']); // if (!stristr($string_referrer, 'archive') === FALSE) { $new_request = 'Main Page'; } else { if (!stristr($string_referrer, 'blogid') === FALSE) { $new_request = 'Main Page'; } else { $replacements = array('item/'=>'','/catid/1'=>'','/catid/2'=>'','/catid/3'=>'','/catid/4'=>'','/catid/5'=>'','/catid/6'=>'','/catid/7'=>'','/catid/8'=>'','http://www.example.jp/index.php'=>'','?virtualpath='=>''); $new_request = strtr($string_referrer,$replacements); // $new_request is empty if ($new_request == '') { $new_request = 'Main Page'; } // leave it like that } } define("_BBC_PAGE_NAME", $new_request); define("_BBCLONE_DIR", "/var/www/example/bbclone/"); define("COUNTER", _BBCLONE_DIR."mark_page.php"); if (is_readable(COUNTER)) include_once(COUNTER); ?>
上記のhttp://www.example.jp/index.phpはNucleusのindex.phpのパスに合わせてください。
また、_BBCLONE_DIRも設置する環境に合わせてください。
次に権限と所有者を念のため変更します。
www:/var/www/example# chmod 755 bbclone.php www:/var/www/example# chown www-data.www-data bbclone.php
最後に、Nucleusのindex.phpを修正します。
www:/var/www/example# vi index.php <?php //setup for benchmarking include('./benchmark.inc'); // This file will generate and return the main page of the site $CONF = array(); $CONF['Self'] = ''; include('./config.php'); include ('./bbclone.php'); selector(); ?>
上記の設定は環境に依存するため確認します。ピンクの箇所のみ追加して下さい。
以上でサブカテゴリー、customURL単位でアクセスが識別可能となります。
肝心のパスのところはモザイク処理させて頂いていますが、http://www.example.jp/subcategory/contents.htmlのように表示されます。
文字化け対応
検索キーワードやコンテンツによっては文字化けしてしまう事象が発生したため、こちらのサイトを参考に文字化け対応を実施します。
編集するファイル:bbclone/constant.php 60行目
$BBC_SEP = chr(173);$BBC_SEP = ">>>>>>>>>>";
編集するファイル:bbclone/lib/referrer.php 40行目
$pool[$i] = preg_replace("%^\W*(\b.{2,}\b)\W*$%", "\\1", $pool[$i]);$pool[$i] = (defined("_BBC_MBSTRING")) ? mb_ereg_replace("%^¥W*(¥b.{2,}¥b)¥W*$%", "¥¥1", $pool[$i]) : preg_replace("%^¥W*(¥b.{2,}¥b)¥W*$%", "¥¥1", $pool[$i]);
編集するファイル:bbclone/lib/referrer.php 124〜126行目
$raw_search = (($from !== false) || defined("_BBC_RECODE")) ? bbc_convert_lang($raw_search, $from, $char) : $raw_search; $raw_search = bbc_get_sep($raw_search, $word_sep);$raw_search = (($from !== false) || defined("_BBC_RECODE")) ? bbc_convert_lang($raw_search, $from, $char) : $raw_search; $raw_search = defined("_BBC_MBSTRING") ? mb_convert_kana($raw_search,"aKV") : $raw_seach; $raw_search = defined("_BBC_MBSTRING") ? mb_ereg_replace(' ','+',$raw_search) : $raw_seach; $raw_search = bbc_get_sep($raw_search, $word_sep);
編集するファイル:bbclone/lib/referrer.php 131行目
$tmp = !$char ? strtolower(bbc_clean($raw_search[$i])) : bbc_clean($raw_search[$i]);bbc_clean($raw_search[$i]); $tmp = defined("_BBC_MBSTRING") ? mb_strtolower(bbc_clean($raw_search[$i])) : strtolower(bbc_clean($raw_search[$i]));
編集するファイル:bbclone/log_processor.php 112行目
if (defined("_BBC_MBSTRING") && (stristr("UTF", $char) || stristr("EUC-JP", $char) || stristr("gb2312", $char))) {if (defined("_BBC_MBSTRING") && (stristr("UTF", $char) || stristr("UTF-8", $char) || stristr("gb2312", $char))) {
上記の修正により文字化けが解消されましたが、再発しないかはしばらく様子を見ることにします。
【おまけ】bbcloneの速度調査
スペックの高い自宅サーバに設置している時は感じなかったのですが、OpenBlockS600に設置した際に閲覧速度が落ちたため、スクリプトの中身にgetmicrotime();を入れて所要時間を調べてみました。まず、bbclone.phpがincludeしているmark_page.phpから見てみます。
- mark_page.php
function getmicrotime(){ list($msec, $sec) = explode(" ", microtime()); return ((float)$sec + (float)$msec); } $timeA = getmicrotime(); bbc_add_new_connections($new_access); $timeA = getmicrotime() - $timeA; ?> <p>1箇所目は<?=$timeA;?></p> <?php ... $timeB = getmicrotime(); bbc_write_data($c, ""); $timeB = getmicrotime() - $timeB; ?> <p>2箇所目は<?=$timeB;?></p> <?php
bbc_add_new_connections($new_access);で1.5秒、bbc_write_data($c, “<?php\n\$last =\n”.bbc_array_to_str($last).”;\n?>”);で0.7秒要していました。より影響の大きいbbc_add_new_connectionsについてもう少し詳しく調べてみます。
- bbc_add_new_connections($new_access);の調査。bbc_add_new_connectionはlog_processor.phpの中で定義されているので、log_processor.phpにgetmicrotime();を設置します。
$timeC = getmicrotime(); $connect = bbc_update_connect($connect); $timeC = getmicrotime() - $timeC; ?> <p>3箇所目は<?=$timeC;?></p> <?php
bbc_udpate_connectで1.5秒要しています。
- bbc_update_connectの調査。bbc_update_connectはlib/new_connect.phpの中で定義されているので、new_connect.phpの中身を見てみます。
function bbc_update_connect($connect) { ... while (list(${$i."_name"}, ${$i."_elem"}) = each($$i)) { reset(${$i."_elem"}['rule']); while (list($pattern, $note) = each(${$i."_elem"}['rule'])) { // eregi() is intentionally used because some php installations don't // know the "i" switch of preg_match() and would generate phony compile // error messages if (!eregi($pattern, $connect['agent'], $regs)) continue; if ($i == 'bonus') { $connect[$i.'_'.$bonus_counter] = ${$i."_name"}; } else { $connect[$i] = ${$i."_name"}; } if (preg_match(":\\\\[\d]{1}:" ,$note)) { $str = preg_replace(":\\\\([\d]{1}):", "\$regs[\\1]", $note); eval("\$str = \"$str\";"); $connect[$i."_note".(($i == 'bonus') ? '_'.$bonus_counter : '')] = $str; } if ($i != 'bonus') break 2; $bonus_counter++; } }
アクセスがあるごとにこのループが数百回廻ることで遅延していました。
微修正では直りそうも無いので、本サイトではアクセス時に不可のかからないresearch artisanを導入することにします。