bbcloneの設定

投稿者: | 2010年8月20日
Pocket

対象サーバについて

製品名 OpenBlockS 600
OS(kernel ver) Debian lenny(2.6.29)
CPU 600MHz(AMCC PowerPC 405EX)
メモリ 1GB(DDR2 SDRAM)
ストレージ 8GB(Compact Flash)

bbcloneについて

見た目重視のWebアクセス解析ソフトです。

bbclone

アクセス時に無駄な計算が走るので(本ページ末尾に原因の調査結果を記載しています。)パワーの無い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

文字化け対応

検索キーワードやコンテンツによっては文字化けしてしまう事象が発生したため、こちらのサイトを参考に文字化け対応を実施します。

編集するファイル: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から見てみます。

  1. 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についてもう少し詳しく調べてみます。

  2. 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秒要しています。

  3. 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を導入することにします。

Pocket

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です