・ブラウザからは1x1ドットの透過画像として表示されます。 ------------------------------------------------------------------------------ 【統計情報の表示】 ・ブラウザから、下記のURLにアクセスしてください。 http://<ホスト名>/<ディレクトリ名>/access.php?m=view ACCESS_KEYの設定を変更することで、統計情報を表示するURLを変更できます。 ------------------------------------------------------------------------------ 【任意画像の表示】 ・アクセス時に透過画像でなく任意の画像を表示する場合は、IMAGE_FILEの設定を  変更して、アクセスを記録したいHTMLファイルに下記のコードを記述して下さい。 ------------------------------------------------------------------------------ 【更新履歴】 日付 Ver 内容 2000/07/11 0.10 ソースを公開。 2000/07/17 0.11 JavaScriptのRefererの取得方法を修正。 2000/09/27 0.12 統計表示時の行取得をfgetcsv()からfgets()に変更。 ブラウザとOSのリストを更新。 2000/11/09 0.20 Refererの検索文字部分を正常に表示するよう、EUCに変換。 検索文字・使用サーチエンジン統計の機能を追加。 テーブル表示ルーチンを修正。 2000/11/10 0.21 サーチエンジンはリンク統計に集計しないよう修正。 2000/11/15 0.22 統計処理の見直しと処理時間の表示。 対応サーチエンジンの追加。 2000/11/22 0.23 検索文字列の分割格納を追加。 2001/01/11 0.24 PHP4でも動作するように修正。 *****************************************************************************/ // 記録しないリンク元URLの設定 (","で区切って複数指定可) $skipurl = array( "http://keeps.sourceforge.jp/", "http://keeps.sourceforge.jp/access.php?m=view", "http://keeps.sourceforge.jp/admin.php", "http://keeps.sourceforge.jp/admin.php?form%5Bpass%5D=key0501" ); // 画像ファイル名の設定 define("IMAGE_FILE", "/path/title.gif"); // 統計情報表示キーの設定 // "b", "i", "g"以外の文字列を設定してください。 define("ACCESS_KEY", "view"); // ファイル格納ディレクトリの設定 define("DATA_DIR", "dat"); // アクセス記録ファイル名の設定 define("LOG_FILE", "access"); // ログファイル名 define("COUNTER_FILE", "count.dat"); // カウンタファイル名 // クッキーの設定 define("COOKIE_NAME", "ACCESS"); // クッキー名 define("COOKIE_MSG", "HELLO"); // クッキーメッセージ // 最大記録数 (0は無制限) define("MAX_RECORD", 1000); // 時間帯別統計の設定 [0/1] (時間帯別統計を当日のみにする場合は"1") define("TIMEZONE", 1); // ホスト名非表示の設定 [0/1] (ホスト名の第一フィールドを"*"にする場合は"1") define("HIDDENHOST", 1); // 統計表示数の設定 (0は非表示) define("NUM_DAY", 10); // 日別統計の表示数 define("NUM_HOUR", 24); // 時間帯別統計の表示数 define("NUM_REMOTE", 0); // ホスト統計の表示数 define("NUM_AGENT", 0); // AGENT統計の表示数 define("NUM_BROWSER", 10); // ブラウザ統計の表示数 define("NUM_OS", 10); // OS統計の表示数 define("NUM_REFERER", 10); // リンク統計の表示数 define("NUM_RECENT", 0); // 最近のアクセスの表示数 define("NUM_SEARCH", 10); // 検索文字の表示数 define("NUM_ENGINE", 10); // 使用サーチエンジンの表示数 // 判別リスト外のレコード取得設定 [0/1] define("CHECK_OTHER", 1); // 検索文字の分割取得設定 [0/1] define("SEARCHWORD_DIVIDE", 1); // ブラウザ判別リスト $browserlist = array( "Safari" => "(Mac OS X) Safari", "Opera/8" => "Opera 8", "Opera/7" => "Opera 7", "Opera/6" => "Opera 6", "Opera 6" => "Opera 6", "Asahina-Antenna" => "朝日奈アンテナ", "ASTEL" => "ASTEL", "Cuam" => "Cuam", "DoCoMo" => "DoCoMo", "Donut" => "Donut", "DreamPassport" => "Dream Passport", "Googlebot" => "Googlebot", "iCab" => "iCab", "Internet Ninja" => "Internet Ninja", "J-PHONE" => "J-PHONE", "L-mode" => "L-mode", "Lynx" => "Lynx", "MSProxy" => "ProxyServer", "NetCaptor" => "NetCaptor", "OmniWeb" => "OmniWeb", "PerMan" => "波乗野郎", "Pockey" => "GetHTMLW", "Sleipnir" => "Sleipnir", "SpaceBison" => "Proxomitron", "UP.Browser" => "EZweb", "WWWOFFLE" => "WWWOFFLE", "WebTV" => "WebTV", "WWWC" => "WWWC", "MSIE 6." => "Internet Explorer 6", "MSIE 5." => "Internet Explorer 5", "MSIE 4." => "Internet Explorer 4", "MSIE 3." => "Internet Explorer 3", "Mozilla/5." => "Netscape 6", "Mozilla/4." => "NetscapeNavigator 4", "Mozilla/3." => "NetscapeNavigator 3" ); // OS判別リスト $oslist = array( "NT 5.2" => "Windows Server 2003", "NT 5.1" => "Windows XP", "XP" => "Windows XP", "NT 5.0" => "Windows 2000", "2000" => "Windows 2000", "9x 4.90" => "Windows Me", "ME" => "Windows Me", "Win98" => "Windows 98", "Windows 98" => "Windows 98", "Win95" => "Windows 95", "95" => "Windows 95", "NT 4" => "Windows NT", "WinNT" => "Windows NT", "Windows NT" => "Windows NT", "CE" => "Windows CE", "Mac_PowerPC" => "Macintosh", "Macintosh" => "Macintosh", "FreeBSD" => "FreeBSD", "Linux" => "Linux", "SunOS" => "SunOS", "OS/2" => "OS/2", "WebTV" => "WebTV", "DreamPassport" => "Dreamcast", "Donut" => "(Win) Donut", "Sleipnir" => "(Win) Sleipnir", "WWWC" => "WWWC", "DoCoMo" => "DoCoMo", "L-mode" => "L-mode", "J-PHONE" => "J-PHONE", "UP.Browser" => "EZweb", "ASTEL" => "ASTEL" ); // 検索文字判別リスト define("STRING_SKIP", "-._+%?=/&:\w"); define("STRING_SEARCH", "-._+%\w\s"); $patternlist = array( // サーチエンジン名 ホスト名 変数名 // 国内のサーチエンジン array("engine" => "goo", "host" => "www.goo.ne.jp", "var" => "MT"), array("engine" => "goo", "host" => "goo.ne.jp", "var" => "MT"), array("engine" => "goo", "host" => "mogitate.goo.ne.jp", "var" => "MT"), array("engine" => "Google", "host" => "www.google.com", "var" => "q"), array("engine" => "Yahoo!", "host" => "search.yahoo.co.jp", "var" => "p"), array("engine" => "InfoSeek", "host" => "www.infoseek.co.jp", "var" => "qt"), array("engine" => "InfoSeek", "host" => "japan.infoseek.com", "var" => "qt"), array("engine" => "InfoSeek", "host" => "japanbeta.infoseek.com", "var" => "qt"), array("engine" => "excite", "host" => "www.excite.co.jp", "var" => "search"), array("engine" => "Netscape", "host" => "directory.netscape.com", "var" => "search"), array("engine" => "find'X", "host" => "bpdir2.nikkeibp.co.jp", "var" => "kw"), array("engine" => "ISIZE", "host" => "dir.isize.com", "var" => "QueryString"), array("engine" => "msn", "host" => "search.msn.co.jp", "var" => "q"), array("engine" => "msn", "host" => "search.msn.co.jp", "var" => "MT"), array("engine" => "OCN navi", "host" => "search.navi.ocn.ne.jp", "var" => "kw"), array("engine" => "InfoNavigator", "host" => "para.cab.infoweb.ne.jp", "var" => "QueryString"), array("engine" => "FreshEye", "host" => "search.fresheye.com", "var" => "kw"), array("engine" => "Verno", "host" => "verno.ueda.info.waseda.ac.jp", "var" => "index-and"), array("engine" => "ODiN", "host" => "odin.ingrid.org", "var" => "key"), array("engine" => "LYCOS", "host" => "www.lycos.co.jp", "var" => "query"), array("engine" => "kensaku.org", "host" => "kensaku.org", "var" => "key"), array("engine" => "iNet", "host" => "inetg.com", "var" => "key"), // 海外のサーチエンジン array("engine" => "Dogpile", "host" => "search.dogpile.com", "var" => "q"), array("engine" => "Fast Search", "host" => "www.alltheweb.com", "var" => "query"), array("engine" => "Northern Light", "host" => "www.northernlight.com", "var" => "qr"), array("engine" => "GO.com", "host" => "www.go.com", "var" => "qt"), array("engine" => "AltaVista", "host" => "www.altavista.com", "var" => "query"), array("engine" => "WebCrawler", "host" => "www.webcrawler.com", "var" => "searchText"), array("engine" => "excite.com", "host" => "search.excite.com", "var" => "search"), array("engine" => "HotBot", "host" => "hotbot.lycos.com", "var" => "MT"), array("engine" => "MetaCrawler", "host" => "search.metacrawler.com", "var" => "general") ); // テーブルの色の設定 define("BG_LINE", "#990066"); define("BG_LABEL", "#FFaaee"); define("BG_COL", "#FFeeFF"); // 自分自身のファイル名の取得 define("MYFILE", basename(__FILE__)); // PHPバージョンの取得 define("PHPVER", substr(phpversion(), 0, 1)); // ファイルロックの定義 define("READ_LOCK", 1); define("WRITE_LOCK", 2); define("UNLOCK", 3); // ダミー用透過画像の設定 $image_dummy = "R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAEALAAAAAABAAEAAAICTAEAOw=="; // グラフ用画像の設定 $image_bar = " R0lGODlhAQAKALMAAPTs1vDjxuvXtejOpePDld+5hdqudNelZdKZVM6QRcDAwAAAAAAAAAAAAAAA AAAAACH5BAEAAAoALAAAAAABAAoAAAQIEAQxSDEHpQgAOw=="; // アイコン用画像の設定 $image_icon = " R0lGODlhIAAgANX/AP////zpe/r07fbr3vbgcvKtOfHZbPDiy+6pNevQYurXuuimNObJWuXPreWh MuHHnuHBVeCdMNu5T9ubLdq8jdeYKdW0gNWxSNGTKdCqQs+rcc2kPcuPJMijZMiMJMWdNcSbVcSJ I8CWL76EHb2SSryOKbuBHbeKO7eIIraDH7aCHrV/HLSCMLSBILOBKLN/HrKDMrKCILF7Gq57HK18 Ja14Gqx7JKl0GAAAAMDAwAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAADkALAAAAAAgACAAQAb/wJxw SBySWqeicrkkfQgBaGAaYCSFGtKJZGFqLoHbjTq9oAiSUEGU6gDecE23SBrA4QJXgnpZRRAOV0yD FjRzg0UtBRM3Wyd7ZJFTEhR3loJ0LR8fJSwjCAUIIx9kGTcaiDl1lnAUHUokNCSpSzQRhrS5WCcu NCUus7mHQiRgkmE3BAw0GgKWByxCFnMWxscBGRkJJ6x3mEIsCQaQBh8MBBufBSMSUyUKbw/fRCSV eDMoF1JTBC0OJcOadHsz4MSMCg4iYFgxYYSwE/AIggimi5YFFwVCBKzIxMKNjRyXFEIV0osLfWSW gaTFwhoZMegsaLFwAMABCyy6kChBY4gFi1LXqDAgMfCBlhArSLCgwSJoFFIfag6kSIxBUAkoAnwY caJBt4JFLGxAJrTEEwkrEIhCp+GOgnk5ClmlgiYFhwIZgQYwQMIo1SYdDtRUwAEBhxUQyCRY0WKl TxCsOrjci2JCgRYsBx5wAUFCi8KhVvRMxW0ggJwdSKhuISIESUKlLckjJEyLbcdMggAAOw=="; /************************************************** ReadCounter カウンタ値の取得 -------------------------------------------------- 引数 なし 戻り値 カウンタ値 **************************************************/ function ReadCounter() { // カウンタファイルオープン $file = sprintf("%s/%s", DATA_DIR, COUNTER_FILE); if (!file_exists($file)) touch($file); $fp = fopen($file, "r") or die("file open error.
\n"); flock($fp, READ_LOCK) or die("file lock error.
\n"); $counter = fgets($fp, 1024); flock($fp, UNLOCK) or die("file lock error.
\n"); fclose($fp); return $counter; } /************************************************** IncrementCounter カウンタ値をインクリメントする -------------------------------------------------- 引数 なし 戻り値 なし **************************************************/ function IncrementCounter() { // カウンタ値を取得し、インクリメント $counter = ReadCounter(); $counter++; // カウンタファイルに書込み $file = sprintf("%s/%s", DATA_DIR, COUNTER_FILE); if (!file_exists($file)) touch($file); $fp = fopen($file, "w") or die("file open error.
\n"); flock($fp, WRITE_LOCK) or die("file lock error.
\n"); fputs($fp, $counter); flock($fp, UNLOCK) or die("file lock error.
\n"); fclose($fp); } /************************************************** AddRecord アクセス情報を記録する -------------------------------------------------- 引数 $remote REMOTE情報 $agent AGENT情報 $referer REFERER情報 戻り値 なし **************************************************/ function AddRecord($remote, $agent, $referer) { global $skipurl; // 記録しないURLのチェック if (count($skipurl)) { while (list($key, $val) = each($skipurl)) if ($val == substr($referer, 0, strlen($val))) $skip = 1; } // 一時ファイルの存在チェック // ログの安全のため、存在する場合は処理を行なわない $tempfile = sprintf("%s/%s.tmp", DATA_DIR, LOG_FILE); if (file_exists($tempfile)) return; // ログファイルオープン $logfile = sprintf("%s/%s.dat", DATA_DIR, LOG_FILE); if (!file_exists($logfile)) touch($logfile); $logfp = fopen($logfile, "r") or die("file open error.
\n"); flock($logfp, READ_LOCK) or die("file lock error.
\n"); // 一時ファイルオープン $tempfp = fopen($tempfile, "a") or die("file open error.
\n"); flock($tempfp, WRITE_LOCK) or die("file lock error.
\n"); // 一時ファイルにデータを追加 fputs($tempfp, sprintf("%d`%s`%s`%s\n", time(), $remote, $agent, $skip ? "" : $referer)); // 最大レコード数までコピー $i = 1; while (!feof($logfp)) { if (MAX_RECORD && $i++ >= MAX_RECORD) break; fputs($tempfp, fgets($logfp, 1024)); } // ファイルクローズ flock($logfp, UNLOCK); flock($tempfp, UNLOCK); fclose($logfp); fclose($tempfp); // 一時ファイルをリネーム unlink($logfile); rename($tempfile, $logfile); } /************************************************** StatisticsRecord 統計を取得する -------------------------------------------------- 引数 $daylist 日別統計 $hourlist 時間帯別統計 $remote ホスト統計 $agent Agent統計 $browser ブラウザ統計 $os OS統計 $referer リンク統計 $search 検索文字 $engine サーチエンジン $recent 最近のアクセス 戻り値 統計レコード数 **************************************************/ function StatisticsRecord(&$daylist, &$hourlist, &$remote, &$agent, &$browser, &$os, &$referer, &$search, &$engine, &$recent) { // ブラウザ・OS・検索文字判別リストの取得 global $browserlist, $browsername; global $oslist, $osname; global $patternlist, $enginename; global $start; // ログファイルを読込 $utime = utime(); $logfile = sprintf("%s/%s.dat", DATA_DIR, LOG_FILE); $contents = file($logfile); echo "\n"; // ループ $utime = utime(); $lines = 0; $today = date("Y年m月d日"); while (list($contkey, $contval) = each($contents)) { // セパレータで分割 $delta = utime(); $data= explode("`", $contval); if (!$data[0]) continue; $time["explode"] += utime() - $delta; // 日付・時間の取得 $delta = utime(); $date = date("Y年m月d日", $data[0]); $datetime = date("Y/m/d H:i:s", $data[0]); $hour = date("H時", $data[0]); $time["getdate"] += utime() - $delta; // 日別の格納 if (NUM_DAY) { $delta = utime(); $daylist[$date]++; if ($lines < NUM_RECENT) $recent[$lines]["date"] = $datetime; $time["date"] += utime() - $delta; } // 時間別の格納 if (NUM_TIME) { $delta = utime(); if (!TIMEZONE || (TIMEZONE && $date == $today)) $hourlist[$hour]++; $time["time"] += utime() - $delta; } // REMOTEの格納 if (NUM_REMOTE) { $delta = utime(); if (HIDDENHOST) { if (preg_match("/(\d+\.\d+\.\d+)\.\d+$/", $data[1], $parts)) $host = sprintf("%s.*", $parts[1]); else $host = "*".substr($data[1], strpos($data[1], ".")); } else $host = $data[1]; $remote[$host]++; $time["remote"] += utime() - $delta; } if ($lines < NUM_RECENT) $recent[$lines]["remote"] = $host; // AGENTの格納 if (NUM_AGENT) { $delta = utime(); $ag = $data[2] ? $data[2] : "Unknown"; $agent[$ag]++; if ($lines < NUM_RECENT) $recent[$lines]["agent"] = $ag; $time["agent"] += utime() - $delta; } // ブラウザの判別 if (NUM_BROWSER) { $delta = utime(); $found = 0; reset($browserlist); while (list($key, $val) = each($browserlist)) { if (ereg($key, $data[2])) { $browser[$val]++; $found = 1; break; } } if (CHECK_OTHER && !$found) $browser[$data[2] ? "(Other) ".$data[2] : "Unknown"]++; $time["browser"] += utime() - $delta; } // OSの判別 if (NUM_OS) { $delta = utime(); $found = 0; reset($oslist); while (list($key, $val) = each($oslist)) { if (ereg($key, $data[2])) { $os[$val]++; $found = 1; break; } } if (CHECK_OTHER && !$found) $os[$data[2] ? "(Other) ".$data[2] : "Unknown"]++; $time["os"] += utime() - $delta; } // 検索文字の判別 $data[3] = trim($data[3]); if (NUM_SEARCH) { $delta = utime(); reset($patternlist); unset($matched); while (list($key, $val) = each($patternlist)) { $pattern = sprintf("'http://%s/[%s]+%s=([%s]*)'", $val["host"], STRING_SKIP, $val["var"], STRING_SEARCH); if (preg_match($pattern, $data[3], $parts)) { if ($parts[1]) { $searchword = i18n_convert(urldecode(trim($parts[1])), "EUC", "auto"); // 検索文字列の分割取得 if (SEARCHWORD_DIVIDE) { $divideword = explode(" ", $searchword); while (list($divkey, $divval) = each($divideword)) $search[$divval]++; } else $search[$searchword]++; $engine[$val["engine"]]++; } $matched = 1; break; } } $time["search"] += utime() - $delta; } // REFERERの格納 if (NUM_REFERER) { $delta = utime(); if ($data[3] && !$matched) $referer[i18n_convert(urldecode($data[3]), "EUC", "auto")]++; if ($lines < NUM_RECENT) $recent[$lines]["referer"] = $data[3]; $time["referer"] += utime() - $delta; } $lines++; } echo "\n"; while (list($key, $val) = each($time)) printf("\n", "[".$key."]", $val); // ソート if (count($remote)) arsort($remote); if (count($agent)) arsort($agent); if (count($browser)) arsort($browser); if (count($os)) arsort($os); if (count($referer)) arsort($referer); if (count($search)) arsort($search); if (count($engine)) arsort($engine); return $lines; } /************************************************** DispList 統計情報のテーブル表示 -------------------------------------------------- 引数 $label ラベル $list 統計情報配列 $sum 合計レコード数 $listnum 表示行数 戻り値 なし **************************************************/ function DispList($label, $list, $sum, $listnum=0) { // 値の合計を取得 while (list($key, $val) = each($list)) { if ($listnum && ++$i > $listnum) break; $valsum += $val; } // 集計情報の表示 ?> $listnum) break; $ratio = (int)($val / $valsum * 100); ?>
カウント ポイント グラフ
%
カウント合計
Access Statistics
ホーム

アクセス統計

( 現在) array( "title" => "日別統計", "label" => "日付", "list" => "daylist", "sum" => $sum, "num" => NUM_DAY), "hour" => array( "title" => "時間帯別統計", "label" => "時間", "list" => "hourlist", "sum" => $daylist[$today], "num" => NUM_HOUR), "remote" => array( "title" => "ホスト統計", "label" => "ホスト", "list" => "remote", "sum" => $sum, "num" => NUM_REMOTE), "agent" => array( "title" => "Agent統計", "label" => "Agent", "list" => "agent", "sum" => $sum, "num" => NUM_AGENT), "browser" => array( "title" => "ブラウザ統計", "label" => "ブラウザ", "list" => "browser", "sum" => $sum, "num" => NUM_BROWSER), "os" => array( "title" => "OS統計" , "label" => "OS", "list" => "os", "sum" => $sum, "num" => NUM_OS), "referer" => array( "title" => "リンク統計", "label" => "リンク先", "list" => "referer", "sum" => $sum, "num" => NUM_REFERER), "search" => array( "title" => "検索文字統計", "label" => "検索文字", "list" => "search", "sum" => $sum, "num" => NUM_SEARCH), "engine" => array( "title" => "使用サーチエンジン統計", "label" => "サーチエンジン", "list" => "engine", "sum" => $sum, "num" => NUM_ENGINE) ); // 表示フラグの設定 $disp["day"]["flag"] = NUM_DAY && count($daylist); $disp["hour"]["flag"] = NUM_HOUR && count($hourlist); $disp["remote"]["flag"] = NUM_REMOTE && count($remote); $disp["agent"]["flag"] = NUM_AGENT && count($agent); $disp["browser"]["flag"] = NUM_BROWSER && count($browser); $disp["os"]["flag"] = NUM_OS && count($os); $disp["referer"]["flag"] = NUM_REFERER && count($referer); $disp["search"]["flag"] = NUM_SEARCH && count($search); $disp["engine"]["flag"] = NUM_ENGINE && count($engine); // リンクの生成 $linkstr = "(Go To : トップ \n"; while (list($key, $val) = each($disp)) if ($val["flag"]) $linkstr .= sprintf("%s \n", $key, $val["title"]); if (NUM_RECENT) $linkstr .= "最近のアクセス "; $linkstr .= ")\n"; // 統計情報出力 $utime = utime(); flush(); // 統計情報の表示 reset($disp); while (list($key, $val) = each($disp)) { // 表示フラグのチェック if ($val["flag"]) { ?>

(件)





最近のアクセス (最新件)



日時 Remote Agent Referer
\n"; echo "\n"; ?>
Access Statistics by trustBee