一定期間内にサイトにアクセスした人の数をカウントしたい ユーザーの訪問数を記録するには、Cookie、セッション、テキスト、またはデータベースを使用できます。この記事では、PHP を Mysql および jQuery と組み合わせて使用し、オンライン人数と訪問者の地域分布をカウントする例を示します。
通常、訪問者が Web サイトにアクセスすると、ページにユーザーの Cookie 情報が記録されます。Cookie の有効期限が切れると、ユーザーはオフラインとみなされます。この記事では、PHP を使用して訪問者の IP を記録し、クライアント上の Cookie と有効期限を記録します。同時に、Sina IP アドレス インターフェイスを通じて訪問者の地理的位置を取得します (この例では、都道府県のみを記録します)。それを統計用に mysql テーブルに書き込むと、一定期間内の訪問者の総数や訪問者の地域分布も確認できます。
現在のオンライン人数を表示するページに div #total を配置し、訪問者の地域分布を表示するために使用するリスト #onlinelist をデフォルトで配置し、後で jQuery を使用してリストに読み込みを行います。マウスが詳細リストを表示する上でスライドするときの制御。
<div class="demo"> <div id="total">当前在线:<span id="onlinenum"></span></div> <ul id="onlinelist"> <li><img src=http://www.php100.com/html/webkaifa/PHP/PHPyingyong/2013/0321/"loader.gif"></li> </ul> </div>
表示効果をレンダリングするために CSS を使用します。以下のコードでは、CSS3 を使用しています。そのため、効果をプレビューするには最新のブラウザーを使用することをお勧めします。
.demo{width:150px; margin:20px auto; font-size:14px} #total{padding:6px 10px; background:#090 url(arr.png) no-repeat right top; color:#fff; cursor:pointer; -moz-border-radius:5px; -webkit-border-radius:5px; border-radius:5px; -moz-box-shadow:0 0 3px #ccc; -webkit-box-shadow:0 0 3px #ccc;box-shadow:0 0 3px #ccc;} #onlinelist{background:#f7f7f7; border:1px solid #d3d3d3; display:none; -moz-border-radius:5px; -webkit-border-radius:5px; border-radius:5px; -moz-box-shadow:0 0 3px #ccc; -webkit-box-shadow:0 0 3px #ccc;box-shadow:0 0 3px #ccc;} #onlinelist li{height:20px; line-height:20px;padding:4px 6px;border-bottom:1px dotted #d9d9d9} #onlinelist li span{float:right} #onlinelist li:hover{background:#fff}
訪問者のIP、地域、アクセス時間を記録するためにオンラインでデータテーブルを準備する必要があります。サンプル統計プロセス全体はこのテーブルに依存しており、その構造は次のとおりです:
CREATE TABLE IF NOT EXISTS `online` ( `id` int(11) NOT NULL AUTO_INCREMENT, `ip` varchar(30) NOT NULL, `province` varchar(64) NOT NULL, `addtime` int(10) NOT NULL DEFAULT '0', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
online.php は、IP アドレスや地域などの訪問者情報を記録するために使用されます。まず、データ テーブルに訪問者 IP レコードがあるかどうかを確認し、存在する場合は、ユーザーの州と地域を取得し、ユーザーの IP、つまり州と地域をテーブルに挿入します。ここで、訪問者の Cookie レコードがあるかどうかを判断できます。存在しない場合は、Sina IP アドレス データベースから訪問者の地域情報を要求し、Cookie の値と有効期限を設定します。最後に、テーブル内の期限切れのレコードを削除し、レコードの総数をカウントして出力します。詳細はコードのコメントを参照してください。
include_once('connect.php'); //连接数据库 $ip = get_client_ip(); //获取客户端IP $time = time(); //查询表中是否有ip为当前访客IP的记录 $query = mysql_query("select id from online where ip='$ip'"); if(!mysql_num_rows($query)){//如果不存在访客IP if($_COOKIE['geoData']){//如果存在cookie,则获取用户的区域 $province = $_COOKIE['geoData']; //区域(省份) }else{ $api = "http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=json&ip=$ip"; $json = file_get_contents($api);//调用新浪IP地址库 $arr = json_decode($json,true);//解析json $province = $arr['province'];//获取省份 setcookie('geoData',$province,$time+600); //设置cookie,设置过期时间为10分钟 } //将访客信息插入到数据表中 mysql_query("insert into online (ip,province,addtime) values ('$ip','$province','$time')"); }else{//如果存在,则更新该用户访问时间 mysql_query("update online set addtime='$time' where ip='$ip'"); } //删除已过期的记录 $outtime = $time-600; mysql_query("delete from online where addtime<$outtime"); //统计总记录数,即在线用户数 list($totalOnline) = mysql_fetch_array(mysql_query("select count(*) from online")); echo $totalOnline;//输出在线总数 mysql_close();
新浪IPアドレスライブラリの呼び出しについて
get_client_ip() 関数は、ユーザーの実際の IP を取得するために使用されます。
function get_client_ip() { if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown")) $ip = getenv("HTTP_CLIENT_IP"); else if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown")) $ip = getenv("HTTP_X_FORWARDED_FOR"); else if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown")) $ip = getenv("REMOTE_ADDR"); else if (isset ($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown")) $ip = $_SERVER['REMOTE_ADDR']; else $ip = "unknown"; return ($ip); }
geo.php は、各州(地域)の訪問者数の分布をカウントするために使用されます。データベースにクエリを実行し、州ごとに並べ替えるだけで、フロントエンドの Ajax インタラクションを容易にするために、最終的なデータセットが JSON 形式で出力されることに注意してください。
include_once('connect.php');//连接数据库 //查询区域统计 $sql = "select province,count(*) as total from online group by province order by total desc"; $result = mysql_query($sql); while($row=mysql_fetch_array($result)){ $list[] = array( 'province' => $row['province'], 'total' => $row['total'] ); } echo json_encode($list);//以json格式输出
フロントエンド ページが行う必要があるのは、ページが読み込まれるときに訪問者の合計数を表示することです。つまり、ajax を使用して online.php をリクエストします。次に、マウスを統計の矢印の上にスライドさせると、ajax 経由で geo.php をリクエストして、各地域および州のオンライン人口の数を取得し、その結果をドロップダウン形式で表示します。
$(function(){ $("#onlinenum").load("online.php"); $(".demo").hover(function(){ $("#onlinelist").slideDown("fast"); var str = ''; $.getJSON("geo.php",function(json){ $.each(json,function(index,array){ str = str + "<li><span>"+array['total']+"</span>"+array['province']+"</li>"; }); $("#onlinelist").html(str); }); },function(){ $("#onlinelist").slideUp("fast"); }); });
最後に、この例は jquery に依存しているため、最初に jquery ライブラリをページにロードすることを忘れないでください。現在のバージョンは jquery-1.9.1 です。