用php实现一个简单的访客统计功能,统计网站的总访问量是多少
用php实现一个简单的访客统计功能,统计网站的总访问量是多少,简单实用。php通过每次打开文本文件,获取文本中的数字,进行加1再写入到文本中。所以只要每次有访问就会进行累加pv数量来实现的简单访客次数的统计。
<?php if(!file_exists("count.txt")){ $one_file=fopen("count.txt","w+"); //建立一个统计文本,如果不存在就创建 echo"您是第<font color='red'><b>1</b></font>位访客"; //首次直接输出第一次 fwrite("count.txt","1"); //把数字1写入文本 fclose("$one_file"); }else{ //如果不是第一次访问直接读取内容,并+1,写入更新后再显示新的访客数 $num=file_get_contents("count.txt"); $num++; file_put_contents("count.txt","$num"); $newnum=file_get_contents("count.txt"); echo"您是第<font color='red'><b>".$newnum."</b></font>位访客"; } ?>
php访客统计简单程序,上面的代码统计了网站的pv数,网站中除了要统计pv(页面访问次数)数,还有uv(用户访问次数)的统计,这是需要加上cookie来区别开每个用户,如果已经存在cookie,说明访问过,不再进行累加。代码如:
<?php if(!empty($_COOKIE["access"]) && $_COOKIE["access"]==1){ if(!file_exists("count.txt")){ $one_file=fopen("count.txt","w+"); echo"您是第<font color='red'><b>1</b></font>位访客"; fwrite("count.txt","1"); fclose("$one_file"); setcookie("access",1, time()+3600*24); //访问过标记 }else{ $num=file_get_contents("count.txt"); $num++; file_put_contents("count.txt","$num"); $newnum=file_get_contents("count.txt"); echo"您是第<font color='red'><b>".$newnum."</b></font>位访客"; setcookie("access",1, time()+3600*24);//访问过标记 } } ?>
二、获取详细信息统计
在网站的一个公共文件中,进行每次访问时获取用户的ip、浏览器类型、系统类型、访问时间、访问当前地址、访问来源、ip对属地信息的统计。通过这些信息就能大致知道哪个地方访问人数最大、哪篇文章访问人数最大、今日访问人数、pv、恶意访问ip等信息就都出来了。
1.数据库表结构:
CREATE TABLE `visitors` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', `ip` char(30) DEFAULT NULL COMMENT 'ip地址', `froms` char(100) DEFAULT NULL COMMENT '归属地', `add_time` datetime NOT NULL COMMENT '添加时间', `system` char(60) DEFAULT NULL COMMENT '操作系统', `browser` char(200) DEFAULT NULL COMMENT '浏览器', `pageview` char(200) DEFAULT NULL COMMENT '受访页面', `source_link` varchar(1000) DEFAULT NULL COMMENT '来源链接', PRIMARY KEY (`id`), KEY `ip` (`ip`), KEY `add_time` (`add_time`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='访客表';
2.php统计代码
在一个公共php文件中放置获取信息代码,并写入到数据库中。
//获取访客信息 //pdo连接数据库 $db_ms='mysql'; $db_host='127.0.0.1'; $db_user='root'; $db_pass='123456'; $db_name='test'; $dbh=$db_ms.':host='.$db_host.';'.'dbname='.$db_name; try{ $dbh = new PDO($dbh,$db_user,$db_pass); //echo '连接成功'; $dbh -> query('set names utf8'); }catch(PDOException $e){ die('error:'.$e->getMessage()); } function visitor(){ global $dbh; #当前url $url=$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']; #获取ip和来源 $address = GetIpFrom(); $froms = $address[0]; $ip = $address[1]; #获取浏览器和系统类型 $broswer = get_broswer(); $os = get_os(); #获取最后来源地址 if(empty($_SERVER['HTTP_REFERER'])){ $source_link = $url; }else{ $source_link = $_SERVER['HTTP_REFERER']; } #限制ip访问次数 $sqlco = "select count(id) as num FROM visitors where ip ="."'".$ip."'"." AND add_time>="."'".date('Y-m-d',time())."'"; $cres = $dbh -> query($sqlco); $vnum = $cres -> fetch(); if($vnum['num']>10000){ exit('Sorry... You visited the number more than 10000 times today, and the access denied!'); } #获取到的信息放入数据库 $sql =" INSERT INTO visitors (ip,froms,add_time,system,browser,pageview,source_link) VALUES ('$ip','$froms',now(),'$os','$broswer','$url','$source_link')"; $dbh -> exec($sql); }
获取客户端真实ip和ip归属地函数
function GetIps(){ $realip = ''; $unknown = 'unknown'; if (isset($_SERVER)){ if(isset($_SERVER['HTTP_X_FORWARDED_FOR']) && !empty($_SERVER['HTTP_X_FORWARDED_FOR']) && strcasecmp($_SERVER['HTTP_X_FORWARDED_FOR'], $unknown)){ $arr = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']); foreach($arr as $ip){ $ip = trim($ip); if ($ip != 'unknown'){ $realip = $ip; break; } } }else if(isset($_SERVER['HTTP_CLIENT_IP']) && !empty($_SERVER['HTTP_CLIENT_IP']) && strcasecmp($_SERVER['HTTP_CLIENT_IP'], $unknown)){ $realip = $_SERVER['HTTP_CLIENT_IP']; }else if(isset($_SERVER['REMOTE_ADDR']) && !empty($_SERVER['REMOTE_ADDR']) && strcasecmp($_SERVER['REMOTE_ADDR'], $unknown)){ $realip = $_SERVER['REMOTE_ADDR']; }else{ $realip = $unknown; } }else{ if(getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), $unknown)){ $realip = getenv("HTTP_X_FORWARDED_FOR"); }else if(getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), $unknown)){ $realip = getenv("HTTP_CLIENT_IP"); }else if(getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), $unknown)){ $realip = getenv("REMOTE_ADDR"); }else{ $realip = $unknown; } } $realip = preg_match("/[\d\.]{7,15}/", $realip, $matches) ? $matches[0] : $unknown; return $realip; } function GetIpFrom($ip = '') { if (empty($ip)) { $ip = GetIps(); } $res = get_ip_city($ip); if ($res) { $address[0] = $res; } else { $address[0] = ''; } $address[1] = $ip; return $address; } /** * $ip string 必传 * 获取ip归属地 * demo 四川省成都市 电信 */ function get_ip_city($ip) { $ch = curl_init(); $url = 'https://whois.pconline.com.cn/ipJson.jsp?ip=' . $ip; //用curl发送接收数据 curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); //请求为https curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); $location = curl_exec($ch); curl_close($ch); // 转码 $location = mb_convert_encoding($location, 'utf-8', 'GB2312'); // 截取{}中的字符串 $location = substr($location, strlen('({') + strpos($location, '({'), (strlen($location) - strpos($location, '})')) * (-1)); // 将截取的字符串$location中的‘,’替换成‘&’ 将字符串中的‘:‘替换成‘=’ $location = str_replace('"', "", str_replace(":", "=", str_replace(",", "&", $location))); // php内置函数,将处理成类似于url参数的格式的字符串 转换成数组 parse_str($location, $ip_location); return $ip_location['addr']; }
上面的函数可以都放在一个公共的文件中,并调用函数
visitor();
即可。其他统计的功能都通过数据库查询统计出来,如:
#查看pv select count(*) as pv from visitors; #查看uv、今日ip select distinct(count(*)) as pv from visitors; ...
还没有评论,来说两句吧...