|
一、文件方式简单统计
用php实现一个简单的访客统计功能,统计网站的总访问量是多少,简单实用。php通过每次打开文本文件,获取文本中的数字,进行加1再写入到文本中。所以只要每次有访问就会进行累加pv数量来实现的简单访客次数的统计。
<?php
if(!file_exists(&#34;count.txt&#34;)){
$one_file=fopen(&#34;count.txt&#34;,&#34;w+&#34;); //建立一个统计文本,如果不存在就创建
echo&#34;您是第<font color=&#39;red&#39;><b>1</b></font>位访客&#34;; //首次直接输出第一次
fwrite(&#34;count.txt&#34;,&#34;1&#34;); //把数字1写入文本
fclose(&#34;$one_file&#34;);
}else{ //如果不是第一次访问直接读取内容,并+1,写入更新后再显示新的访客数
$num=file_get_contents(&#34;count.txt&#34;);
$num++;
file_put_contents(&#34;count.txt&#34;,&#34;$num&#34;);
$newnum=file_get_contents(&#34;count.txt&#34;);
echo&#34;您是第<font color=&#39;red&#39;><b>&#34;.$newnum.&#34;</b></font>位访客&#34;;
}
?> php访客统计简单程序,上面的代码统计了网站的pv数,网站中除了要统计pv(页面访问次数)数,还有uv(用户访问次数)的统计,这是需要加上cookie来区别开每个用户,如果已经存在cookie,说明访问过,不再进行累加。代码如:
<?php
if(!empty($_COOKIE[&#34;access&#34;]) && $_COOKIE[&#34;access&#34;]==1){
if(!file_exists(&#34;count.txt&#34;)){
$one_file=fopen(&#34;count.txt&#34;,&#34;w+&#34;);
echo&#34;您是第<font color=&#39;red&#39;><b>1</b></font>位访客&#34;;
fwrite(&#34;count.txt&#34;,&#34;1&#34;);
fclose(&#34;$one_file&#34;);
setcookie(&#34;access&#34;,1, time()+3600*24); //访问过标记
}else{
$num=file_get_contents(&#34;count.txt&#34;);
$num++;
file_put_contents(&#34;count.txt&#34;,&#34;$num&#34;);
$newnum=file_get_contents(&#34;count.txt&#34;);
echo&#34;您是第<font color=&#39;red&#39;><b>&#34;.$newnum.&#34;</b></font>位访客&#34;;
setcookie(&#34;access&#34;,1, time()+3600*24);//访问过标记
}
}
?>二、获取详细信息统计
在网站的一个公共文件中,进行每次访问时获取用户的ip、浏览器类型、系统类型、访问时间、访问当前地址、访问来源、ip对属地信息的统计。通过这些信息就能大致知道哪个地方访问人数最大、哪篇文章访问人数最大、今日访问人数、pv、恶意访问ip等信息就都出来了。
1.数据库表结构:
CREATE TABLE `visitors` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT &#39;id&#39;,
`ip` char(30) DEFAULT NULL COMMENT &#39;ip地址&#39;,
`froms` char(100) DEFAULT NULL COMMENT &#39;归属地&#39;,
`add_time` datetime NOT NULL COMMENT &#39;添加时间&#39;,
`system` char(60) DEFAULT NULL COMMENT &#39;操作系统&#39;,
`browser` char(200) DEFAULT NULL COMMENT &#39;浏览器&#39;,
`pageview` char(200) DEFAULT NULL COMMENT &#39;受访页面&#39;,
`source_link` varchar(1000) DEFAULT NULL COMMENT &#39;来源链接&#39;,
PRIMARY KEY (`id`),
KEY `ip` (`ip`),
KEY `add_time` (`add_time`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT=&#39;访客表&#39;;2.php统计代码
在一个公共php文件中放置获取信息代码,并写入到数据库中。
//获取访客信息
//pdo连接数据库
$db_ms=&#39;mysql&#39;;
$db_host=&#39;127.0.0.1&#39;;
$db_user=&#39;root&#39;;
$db_pass=&#39;123456&#39;;
$db_name=&#39;test&#39;;
$dbh=$db_ms.&#39;:host=&#39;.$db_host.&#39;;&#39;.&#39;dbname=&#39;.$db_name;
try{
$dbh = new PDO($dbh,$db_user,$db_pass);
//echo &#39;连接成功&#39;;
$dbh -> query(&#39;set names utf8&#39;);
}catch(PDOException $e){
die(&#39;error:&#39;.$e->getMessage());
}
function visitor(){
global $dbh;
#当前url
$url=$_SERVER[&#39;HTTP_HOST&#39;].$_SERVER[&#39;REQUEST_URI&#39;];
#获取ip和来源
$address = GetIpFrom();
$froms = $address[0];
$ip = $address[1];
#获取浏览器和系统类型
$broswer = get_broswer();
$os = get_os();
#获取最后来源地址
if(empty($_SERVER[&#39;HTTP_REFERER&#39;])){
$source_link = $url;
}else{
$source_link = $_SERVER[&#39;HTTP_REFERER&#39;];
}
#限制ip访问次数
$sqlco = &#34;select count(id) as num FROM visitors where ip =&#34;.&#34;&#39;&#34;.$ip.&#34;&#39;&#34;.&#34; AND add_time>=&#34;.&#34;&#39;&#34;.date(&#39;Y-m-d&#39;,time()).&#34;&#39;&#34;;
$cres = $dbh -> query($sqlco);
$vnum = $cres -> fetch();
if($vnum[&#39;num&#39;]>10000){
exit(&#39;Sorry... You visited the number more than 10000 times today, and the access denied!&#39;);
}
#获取到的信息放入数据库
$sql =&#34; INSERT INTO visitors (ip,froms,add_time,system,browser,pageview,source_link) VALUES (&#39;$ip&#39;,&#39;$froms&#39;,now(),&#39;$os&#39;,&#39;$broswer&#39;,&#39;$url&#39;,&#39;$source_link&#39;)&#34;;
$dbh -> exec($sql);
}浏览器信息和ip信息获取函数
//获取浏览器信息
function get_broswer(){
$sys = $_SERVER[&#39;HTTP_USER_AGENT&#39;]; //获取用户代理字符串
if (stripos($sys, &#34;Firefox/&#34;) > 0) {
preg_match(&#34;/Firefox\/([^;)]+)+/i&#34;, $sys, $b);
$exp[0] = &#34;Firefox&#34;;
$exp[1] = $b[1]; //获取火狐浏览器的版本号
} elseif (stripos($sys, &#34;Maxthon&#34;) > 0) {
preg_match(&#34;/Maxthon\/([\d\.]+)/&#34;, $sys, $aoyou);
$exp[0] = &#34;傲游&#34;;
$exp[1] = $aoyou[1];
} elseif (stripos($sys, &#34;Baiduspider&#34;) > 0) {
$exp[0] = &#34;百度&#34;;
$exp[1] = &#39;蜘蛛&#39;;
}elseif (stripos($sys, &#34;YisouSpider&#34;) > 0) {
$exp[0] = &#34;一搜&#34;;
$exp[1] = &#39;蜘蛛&#39;;
}elseif (stripos($sys, &#34;Googlebot&#34;) > 0) {
$exp[0] = &#34;谷歌&#34;;
$exp[1] = &#39;蜘蛛&#39;;
}elseif (stripos($sys, &#34;Android 4.3&#34;) > 0) {
$exp[0] = &#34;安卓&#34;;
$exp[1] = &#39;4.3&#39;;
}
elseif (stripos($sys, &#34;MSIE&#34;) > 0) {
preg_match(&#34;/MSIE\s+([^;)]+)+/i&#34;, $sys, $ie);
$exp[0] = &#34;IE&#34;;
$exp[1] = $ie[1]; //获取IE的版本号
} elseif (stripos($sys, &#34;OPR&#34;) > 0) {
preg_match(&#34;/OPR\/([\d\.]+)/&#34;, $sys, $opera);
$exp[0] = &#34;Opera&#34;;
$exp[1] = $opera[1];
} elseif(stripos($sys, &#34;Edge&#34;) > 0) {
//win10 Edge浏览器 添加了chrome内核标记 在判断Chrome之前匹配
preg_match(&#34;/Edge\/([\d\.]+)/&#34;, $sys, $Edge);
$exp[0] = &#34;Edge&#34;;
$exp[1] = $Edge[1];
} elseif (stripos($sys, &#34;Chrome&#34;) > 0) {
preg_match(&#34;/Chrome\/([\d\.]+)/&#34;, $sys, $google);
$exp[0] = &#34;Chrome&#34;;
$exp[1] = $google[1]; //获取google chrome的版本号
} elseif(stripos($sys,&#39;rv:&#39;)>0 && stripos($sys,&#39;Gecko&#39;)>0){
preg_match(&#34;/rv:([\d\.]+)/&#34;, $sys, $IE);
$exp[0] = &#34;IE&#34;;
$exp[1] = $IE[1];
}else if(stripos($sys,&#39;AhrefsBot&#39;)>0){
$exp[0] = &#34;AhrefsBot&#34;;
$exp[1] = &#39;蜘蛛&#39;;
}else if(stripos($sys,&#39;Safari&#39;)>0){
preg_match(&#34;/([\d\.]+)/&#34;, $sys, $safari);
$exp[0] = &#34;Safari&#34;;
$exp[1] = $safari[1];
}else if(stripos($sys,&#39;bingbot&#39;)>0){
$exp[0] = &#34;必应&#34;;
$exp[1] = &#39;蜘蛛&#39;;
}else if(stripos($sys,&#39;WinHttp&#39;)>0){
$exp[0] = &#34;windows&#34;;
$exp[1] = &#39;WinHttp 请求接口工具&#39;;
}else if(stripos($sys,&#39;iPhone OS 10&#39;)>0){
$exp[0] = &#34;iPhone&#34;;
$exp[1] = &#39;OS 10&#39;;
}else if(stripos($sys,&#39;Sogou&#39;)>0){
$exp[0] = &#34;搜狗&#34;;
$exp[1] = &#39;蜘蛛&#39;;
}else if(stripos($sys,&#39;HUAWEIM&#39;)>0){
$exp[0] = &#34;华为&#34;;
$exp[1] = &#39;手机端&#39;;
}else if(stripos($sys,&#39;Dalvik&#39;)>0){
$exp[0] = &#34;安卓&#34;;
$exp[1] = &#39;Dalvik虚拟机&#39;;
}else if(stripos($sys,&#39;Mac OS X 10&#39;)>0){
$exp[0] = &#34;MAC&#34;;
$exp[1] = &#39;OS X10&#39;;
}else if(stripos($sys,&#39;Opera/9.8&#39;)>0){
$exp[0] = &#34;Opera&#34;;
$exp[1] = &#39;9.8&#39;;
}else if(stripos($sys,&#39;JikeSpider&#39;)>0){
$exp[0] = &#34;即刻&#34;;
$exp[1] = &#39;蜘蛛&#39;;
}else if(stripos($sys,&#39;Baiduspider&#39;)>0){
$exp[0] = &#34;百度&#34;;
$exp[1] = &#39;蜘蛛&#39;;
}
else {
$exp[0] = $sys;
$exp[1] = &#34;&#34;;
}
return $exp[0].&#39; &#39;.$exp[1];
}
//获取操作系统信息
function get_os(){
$agent = empty($_SERVER[&#39;HTTP_USER_AGENT&#39;]) ? &#39;未知&#39; : $_SERVER[&#39;HTTP_USER_AGENT&#39;];
$os = false;
if (preg_match(&#39;/win/i&#39;, $agent) && preg_match(&#39;/nt 6.0/i&#39;, $agent))
{
$os = &#39;Windows Vista&#39;;
}
else if (preg_match(&#39;/win/i&#39;, $agent) && preg_match(&#39;/nt 6.1/i&#39;, $agent))
{
$os = &#39;Windows 7&#39;;
}
else if (preg_match(&#39;/win/i&#39;, $agent) && preg_match(&#39;/nt 6.2/i&#39;, $agent))
{
$os = &#39;Windows 8&#39;;
}else if(preg_match(&#39;/win/i&#39;, $agent) && preg_match(&#39;/nt 10.0/i&#39;, $agent))
{
$os = &#39;Windows 10&#39;;#添加win10判断
}else if (preg_match(&#39;/win/i&#39;, $agent) && preg_match(&#39;/nt 5.1/i&#39;, $agent))
{
$os = &#39;Windows XP&#39;;
}
else if (preg_match(&#39;/win/i&#39;, $agent) && preg_match(&#39;/nt 5/i&#39;, $agent))
{
$os = &#39;Windows 2000&#39;;
}
else if (preg_match(&#39;/win/i&#39;, $agent) && preg_match(&#39;/nt/i&#39;, $agent))
{
$os = &#39;Windows NT&#39;;
}
else if (preg_match(&#39;/win/i&#39;, $agent) && preg_match(&#39;/32/i&#39;, $agent))
{
$os = &#39;Windows 32&#39;;
}
else if (preg_match(&#39;/linux/i&#39;, $agent))
{
$os = &#39;Linux&#39;;
}
else if (preg_match(&#39;/unix/i&#39;, $agent))
{
$os = &#39;Unix&#39;;
}
else if (preg_match(&#39;/sun/i&#39;, $agent) && preg_match(&#39;/os/i&#39;, $agent))
{
$os = &#39;SunOS&#39;;
}
else if (preg_match(&#39;/ibm/i&#39;, $agent) && preg_match(&#39;/os/i&#39;, $agent))
{
$os = &#39;IBM OS/2&#39;;
}
else if (preg_match(&#39;/Mac/i&#39;, $agent) && preg_match(&#39;/PC/i&#39;, $agent))
{
$os = &#39;Macintosh&#39;;
}
else if (preg_match(&#39;/PowerPC/i&#39;, $agent))
{
$os = &#39;PowerPC&#39;;
}
else if (preg_match(&#39;/AIX/i&#39;, $agent))
{
$os = &#39;AIX&#39;;
}
else if (preg_match(&#39;/HPUX/i&#39;, $agent))
{
$os = &#39;HPUX&#39;;
}
else if (preg_match(&#39;/NetBSD/i&#39;, $agent))
{
$os = &#39;NetBSD&#39;;
}
else if (preg_match(&#39;/BSD/i&#39;, $agent))
{
$os = &#39;BSD&#39;;
}
else if (preg_match(&#39;/OSF1/i&#39;, $agent))
{
$os = &#39;OSF1&#39;;
}
else if (preg_match(&#39;/IRIX/i&#39;, $agent))
{
$os = &#39;IRIX&#39;;
}
else if (preg_match(&#39;/FreeBSD/i&#39;, $agent))
{
$os = &#39;FreeBSD&#39;;
}
else if (preg_match(&#39;/teleport/i&#39;, $agent))
{
$os = &#39;teleport&#39;;
}
else if (preg_match(&#39;/flashget/i&#39;, $agent))
{
$os = &#39;flashget&#39;;
}
else if (preg_match(&#39;/webzip/i&#39;, $agent))
{
$os = &#39;webzip&#39;;
}
else if (preg_match(&#39;/offline/i&#39;, $agent))
{
$os = &#39;offline&#39;;
}else if (preg_match(&#39;/iPhone OS 8/i&#39;, $agent))
{
$os = &#39;iOS 8&#39;;
}else if (preg_match(&#39;/YisouSpider/i&#39;, $agent))
{
$os = &#39;一搜引擎&#39;;
}else if (preg_match(&#39;/Yahoo! Slurp/i&#39;, $agent))
{
$os = &#39;雅虎引擎&#39;;
}else if (preg_match(&#39;/iPhone OS 6/i&#39;, $agent))
{
$os = &#39;iOS 6&#39;;
}
else if (preg_match(&#39;/Baiduspider/i&#39;, $agent))
{
$os = &#39;百度引擎&#39;;
}else if (preg_match(&#39;/iPhone OS 10/i&#39;, $agent))
{
$os = &#39;iOS 10&#39;;
}else if (preg_match(&#39;/Mac OS X 10/i&#39;, $agent))
{
$os = &#39;Mac OS 10&#39;;
}
else if (preg_match(&#39;/Ahrefs/i&#39;, $agent))
{
$os = &#39;Ahrefs SEO 引擎&#39;;
}
else if (preg_match(&#39;/JikeSpider/i&#39;, $agent))
{
$os = &#39;即刻引擎&#39;;
}else if (preg_match(&#39;/Googlebot/i&#39;, $agent))
{
$os = &#39;谷歌引擎&#39;;
}else if(preg_match(&#39;/bingbot/i&#39;,$agent)){
$os = &#39;必应引擎&#39;;
}else if(preg_match(&#39;/iPhone OS 7/i&#39;,$agent)){
$os = &#39;iOS 7&#39;;
}else if(preg_match(&#39;/Sogou web spider/i&#39;,$agent)){
$os = &#39;搜狗引擎&#39;;
}else if(preg_match(&#39;/IP-Guide.com Crawler/i&#39;,$agent)){
$os = &#39;IP-Guide Crawler 引擎&#39;;
}else if(preg_match(&#39;/VenusCrawler/i&#39;,$agent)){
$os = &#39;VenusCrawler 引擎&#39;;
}
else{
$os = $agent;
}
return $os;
} 获取客户端真实ip和ip归属地函数
function GetIps(){
$realip = &#39;&#39;;
$unknown = &#39;unknown&#39;;
if (isset($_SERVER)){
if(isset($_SERVER[&#39;HTTP_X_FORWARDED_FOR&#39;]) && !empty($_SERVER[&#39;HTTP_X_FORWARDED_FOR&#39;]) && strcasecmp($_SERVER[&#39;HTTP_X_FORWARDED_FOR&#39;], $unknown)){
$arr = explode(&#39;,&#39;, $_SERVER[&#39;HTTP_X_FORWARDED_FOR&#39;]);
foreach($arr as $ip){
$ip = trim($ip);
if ($ip != &#39;unknown&#39;){
$realip = $ip;
break;
}
}
}else if(isset($_SERVER[&#39;HTTP_CLIENT_IP&#39;]) && !empty($_SERVER[&#39;HTTP_CLIENT_IP&#39;]) && strcasecmp($_SERVER[&#39;HTTP_CLIENT_IP&#39;], $unknown)){
$realip = $_SERVER[&#39;HTTP_CLIENT_IP&#39;];
}else if(isset($_SERVER[&#39;REMOTE_ADDR&#39;]) && !empty($_SERVER[&#39;REMOTE_ADDR&#39;]) && strcasecmp($_SERVER[&#39;REMOTE_ADDR&#39;], $unknown)){
$realip = $_SERVER[&#39;REMOTE_ADDR&#39;];
}else{
$realip = $unknown;
}
}else{
if(getenv(&#39;HTTP_X_FORWARDED_FOR&#39;) && strcasecmp(getenv(&#39;HTTP_X_FORWARDED_FOR&#39;), $unknown)){
$realip = getenv(&#34;HTTP_X_FORWARDED_FOR&#34;);
}else if(getenv(&#39;HTTP_CLIENT_IP&#39;) && strcasecmp(getenv(&#39;HTTP_CLIENT_IP&#39;), $unknown)){
$realip = getenv(&#34;HTTP_CLIENT_IP&#34;);
}else if(getenv(&#39;REMOTE_ADDR&#39;) && strcasecmp(getenv(&#39;REMOTE_ADDR&#39;), $unknown)){
$realip = getenv(&#34;REMOTE_ADDR&#34;);
}else{
$realip = $unknown;
}
}
$realip = preg_match(&#34;/[\d\.]{7,15}/&#34;, $realip, $matches) ? $matches[0] : $unknown;
return $realip;
}
function GetIpFrom($ip = &#39;&#39;){
if(empty($ip)){
$ip = GetIps();
}
$res = @file_get_contents(&#39;http://ip.taobao.com/service/getIpInfo.php?ip=&#39;.$ip);
if($res){
$json = json_decode($res,true);
}else{
$json = &#39;&#39;;
}
//var_dump($json);
$address[0] = $json[&#39;data&#39;][&#39;country&#39;].$json[&#39;data&#39;][&#39;region&#39;].$json[&#39;data&#39;][&#39;city&#39;].$json[&#39;data&#39;][&#39;isp&#39;];
$address[1] = $ip;
return $address;
}上面的函数可以都放在一个公共的文件中,并调用函数
visitor();即可。其他统计的功能都通过数据库查询统计出来,如:
#查看pv
select count(*) as pv from visitors;
#查看uv、今日ip
select distinct(count(*)) as pv from visitors;
...以上内容希望帮助到大家,很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货需要的可以免费分享给大家,需要
或者关注咱们下面的专栏
来源:https://zixuephp.net/article-113.html |
|