教你认识你的访客

布尔教育 PHP教学笔记

【功能主治】
对获取来访者IP不是很了解的同学,以及在获取的过程中出现问题的同学。
痴迷于研究获取访客IP地址一劳永逸的方法者
【不良反应】
如果没有PHP基础知识和简单的HTTP知识,可能会出现头晕,恶心等反应

很多朋友都有自己的技术博客,用来记录自己的学习历程和经验总结之用。经过慢慢地积累,博客内容丰富了,每天的IP数量也在暴增。

这个时候你可能会思考,我的这些访客主要来自哪里?有没有来自国外的呢?这些人都用什么浏览器(进而分析是技术人员多一些还是小白多一些)?什么操作系统?

基于这样的一个需求点,我们来给大家讲解这其中的一些技术点。

授人以渔

我们不是简单地给你~~一个函数~~,也不是给你~~一个类~~,我们是认真地讲解这其中的原理,让你自己能够去封装函数,甚至是类。

1、正常情况下获取访客的IP

说到获取来访者的IP很多童鞋自然想到了那个超全局变量数组$_SERVER。

$ip = $_SERVER[‘REMOTE_ADDR‘];

但是在微软的IIS服务器下,就无法获取IP了,这个时候你需要使用IIS服务器的全局变量HTTP_CLIENT_IP,因为REMOTE_ADDR不好使了。

$ip = $_SERVER[‘HTTP_CLIENT_IP‘];

讲到了这里新的问题又来了,有的用户是通过代理来上的网,那么这个时候你如何解决总是获取PROXY的地址的尴尬局面呢?

不要担心,这个时候我们可以问代理服务器去要访客的真实IP,简言之,就是让代理服务器在替访客请求我的服务器的时候,携带上那位访客的IP,并为其取名HTTP_X_FORWARDED_FOR,这样我的服务器通过获取代理服务器传过来的全局变量$_SERVER[‘HTTP_X_FORWARDED_FOR‘],不正是访客的IP吗?

$realip = $_SERVER[‘HTTP_X_FORWARDED_FOR‘];

2、非正常情况下获取访客IP

这里我们说到的非正常情况就是,全局变量数组被关闭。因为涉及到了服务器的安全问题,毕竟$_SERVER数组暴露太多服务器的隐私。

那关闭后,不能通过$_SERVER数组获取访客IP了,怎么办?

假如生活欺骗了你,不要悲伤,不要心急!忧郁的日子里须要镇静!!!

不要怕,PHP官方小组给了我们一个锦囊,待我慢慢拆开

string getenv ( string $varname )

getenv — 获取一个环境变量的值,使用 phpinfo() 你可以看到所有环境变量的列表。

返回环境变量 varname 的值, 如果环境变量 varname 不存在则返回 FALSE。

对,就是这个getenv()函数,它能解决无法访问$_SERVER的问题。

// 使用代理服务器访问的情况下
$realip = getenv("HTTP_X_FORWARDED_FOR");
// 正常Apache Web服务器环境下
$ip = getenv("REMOTE_ADDR");
// IIS Web服务器环境下
$ip = getenv("HTTP_CLIENT_IP");

好了这些情况,我们都跟大家讲清楚了,那么接下来我们就来封装那个一劳永逸的方法。

封装获取访客真实IP地址的方法

<?php
/**
 * @author DengPeng <[email protected]>
 * @since 2016/11/30
 * @copyright copyright (c) 2016 zixue.it GPL
 * @license http://www.zixue.it/
 */

/**
 * 获取访客的真实IP
 * @return mixed 查询出结果就返回ip字符串,否则返回null
 * 2016-11-30T15:22:19+0800
 */
function getIp()
{
    $ip = null;

    // 1、判断服务器是否开放全局变量数组权限
    if (isset($_SERVER)) {

        if (isset($_SERVER[‘HTTP_X_FORWARDED_FOR‘])) {
            // 1.1、代理环境下
            $ip = $_SERVER[‘HTTP_X_FORWARDED_FOR‘];
        } else if (isset($_SERVER[‘HTTP_CLIENT_IP‘])) {
            // 1.2、IIS服务器环境下
            $ip = $_SERVER[‘HTTP_CLIENT_IP‘];
        } else {
            // 1.3、Apache服务器环境下
            $ip = $_SERVER[‘REMOTE_ADDR‘];
        }

    } else {

        // 2、服务器关闭全局变量数组访问权限
        if (getenv($_SERVER[‘HTTP_X_FORWARDED_FOR‘])) {
            $ip = getenv($_SERVER[‘HTTP_X_FORWARDED_FOR‘]);
        } else if (getenv("HTTP_CLIENT_IP")) {
            $ip = getenv("HTTP_CLIENT_IP");
        } else {
            $ip = getenv("REMOTE_ADDR");
        }
    }

    // 返回访客真实IP
    return $ip;
}

?>

封装获取访客的浏览器、操作系统、地理位置等信息的类

前面我们只是在获取用户IP的基础上进行了重用性函数的封装,那么接下来我们要给大家封装一个实用的类,通过这个类,你能灵活地获取用户的浏览器、操作系统、地理位置等信息。

<?php
/**
 * @author DengPeng <[email protected]>
 * @since 2016/11/30
 * @copyright copyright (c) 2016 zixue.it GPL
 * @license http://www.zixue.it/
 */

class VisitorInfo
{
    // 定义浏览器类型
    static public $browser = null;
    // 定义操作系统类型
    static public $os = null;
    // 定义访客IP
    static public $ip = null;
    // 定义访客位置
    static public $location = null;

    /**
     * 获取浏览器信息
     * @access public
     * @return string 返回浏览器信息
     * 2016-11-30T16:07:54+0800
     */
    static public function getBrowser()
    {
        // 获取访客浏览器信息
        if (isset($_SERVER)) {
            self::$browser = $_SERVER[‘HTTP_USER_AGENT‘];
        } else {
            self::$browser = getenv(‘HTTP_USER_AGENT‘);
        }

        // 匹配访客浏览器类型
        if (preg_match(‘/firefox/i‘, self::$browser)) {
            self::$browser = ‘FireFox‘;
        } else if (preg_match(‘/chrome/i‘, self::$browser)) {
            self::$browser = ‘Chrome‘;
        } else if (preg_match(‘/opera/i‘, self::$browser)) {
            self::$browser = ‘Opera‘;
        } else {
            self::$browser = ‘Other‘;
        }

        return self::$browser;
    }

    /**
     * 获取访客操作系统类型
     * @access public
     * @return string 返回操作系统的类型
     * 2016-11-30T16:11:40+0800
     */
    static public function getOs()
    {
        // 获取访客操作系统信息
        if (isset($_SERVER)) {
            self::$os = $_SERVER[‘HTTP_USER_AGENT‘];
        } else {
            self::$os = getenv(‘HTTP_USER_AGENT‘);
        }

        // 匹配访客操作系统类型
        if (preg_match(‘/win/i‘, self::$os)) {
            self::$os = ‘Windows‘;
        } else if (preg_match(‘/linux/i‘, self::$os)) {
            self::$os = ‘Linux‘;
        } else if (preg_match(‘/mac/i‘, self::$os)) {
            self::$os = ‘Mac‘;
        } else {
            self::$os = ‘Other‘;
        }

        // 返回访客的操作系统类型
        return self::$os;
    }

    /**
     * 获取访客的ip地址
     * @access public
     * @return string 返回访客的ip地址
     * 2016-11-30T16:27:01+0800
     */
    static public function getIp()
    {
        // 1、判断服务器是否开放全局变量数组权限
        if (isset($_SERVER)) {

            if (isset($_SERVER[‘HTTP_X_FORWARDED_FOR‘])) {
                // 1.1、代理环境下
                self::$ip = $_SERVER[‘HTTP_X_FORWARDED_FOR‘];
            } else if (isset($_SERVER[‘HTTP_CLIENT_IP‘])) {
                // 1.2、IIS服务器环境下
                self::$ip = $_SERVER[‘HTTP_CLIENT_IP‘];
            } else {
                // 1.3、Apache服务器环境下
                self::$ip = $_SERVER[‘REMOTE_ADDR‘];
            }

        } else {

            // 2、服务器关闭全局变量数组访问权限
            if (getenv($_SERVER[‘HTTP_X_FORWARDED_FOR‘])) {
                self::$ip = getenv($_SERVER[‘HTTP_X_FORWARDED_FOR‘]);
            } else if (getenv("HTTP_CLIENT_IP")) {
                self::$ip = getenv("HTTP_CLIENT_IP");
            } else {
                self::$ip = getenv("REMOTE_ADDR");
            }
        }

        // 返回访客的ip
        return self::$ip;
    }

    /**
     * 获取访客的地址和ISP(因特网服务提供商)
     * @access public
     * @return sting 返回访客的地址和ISP
     * 2016-11-30T16:40:06+0800
     */
    static public function getLocation()
    {
        // 获取访客IP
        self::getIp();
        // self::$ip = ‘116.243.183.60‘;    // 临时测试IP
        // 利用淘宝IP地址池接口,获得访客的位置
        $url = "http://ip.taobao.com/service/getIpInfo.php?ip=". self::$ip;
        $info = json_decode(file_get_contents($url));
        if ($info->code) {
            return false;
        } else {
            $str = $info->data->country . $info->data->area . $info->data->city . ‘,‘ . $info->data->isp;
            return $str;
        }
    }

}

?>

对获取访客的真实IP地址有了基础的了解,然后我们又一起封装了获取IP的函数和获取访客一些信息的类。我相信有了这些知识的巩固,你一定有办法去认识统计你的访客信息。

时间: 2024-10-12 12:03:37

教你认识你的访客的相关文章

10步教你来优化WordPress速度 为服务器和访客减压

1.Cookie的静态化制作 约有80%至90%的时间,访客要花费大量的时间等你的WordPress加载静态内容.这意味着,有大部分的时间,用户浏览您的网站,他们正在等待加载,如:图像,CSS,JS脚本,flash等等.所以你可以优化内容,更快捷地让WordPress加载一个cookie域.消除了负载时的一些珍贵的时间,当然了这可能看起来并不多,但添加其他拖延问题时,才能真正减少时间损失. 我不知道其他源码的网站应该怎么做,但是wordpress很简单只要修改一下wp-config.php就好了

12大网站建设技巧 让访客信任你

众所周知,网站建设已不是仅仅停留在页面的美观设计上,更重要的是在用户访问你的网站的同时,已经觉得你是一个值 得信任的企业,你们的产品和服务确实能够解决他们的实际问题,这时候网站充当的是一个销售员的角色,来消除访客的担忧,最终让访客相信自己的产品,接受自 己的服务. 你的企业网站必须能够让人产生足够的信赖感,如果你没有这方面的经验,也不要慌张,下面来教你如何建立一个让浏览者信任的网站: 1.网站的第一印象一定要够专业,同时也要根据行业特性和目标群体来设计网站,不要为了所谓的专业把网站设计的千篇一律

博客园访客统计的实现

最近有人让我把博客园里面关于访客统计做一篇文章 一直没有写,今天就发了吧(对不起呀!!一直没有时间) 今天我会发多篇文章关于博客园的美化问题. 相信大家也看到了右侧公告栏的访客量统计的效果,我们可以看到有两个样式,一个是单独统计人数的,一个是统计访客来源的,是不是感觉还挺不错的? 本文就带大家一起详细了解这个样式的制作过程~~~ 首先是数字样式,效果如下 这个我们通过F12去查看下源码,我们可以看到如下图这段源码: <div align="center"> <a hr

瓦尔登湖的访客——读《瓦尔登湖》有感

瓦尔登的访客 程涵 20135210 他曾在美国最好的大学——哈佛大学受过教育,他曾到荒凉的瓦尔登湖边隐居,像一个原始人那样简单地生活, 他与山川草木结为密友,他能从一片叶子看出春夏秋冬,他的手不仅拿笔,也拿斧子,他的眼睛不仅看书,也看绿树.青草.落日和闪动着波光的湖水.他是著名散文集<瓦尔登湖>作者——亨利·戴维·梭罗. 初识梭罗是在初中语文选修课本上的<瓦尔登湖>节选片段,那时的我被晦涩的译文和流水账般的叙述消磨了兴趣,没有进一步品味这本书.真正开始了解梭罗还是在前不久的周末,

多说最近访客通用代码使用方法

添加[最近访客],请在页面中添加如下代码: <ul class="ds-recent-visitors"></ul> <!--多说js加载开始,一个页面只需要加载一次 --> <script type="text/javascript"> var duoshuoQuery = {short_name:"您的多说二级域名"}; (function() { var ds = document.creat

手把手教你建github技术博客by hexo

适合人群 喜欢写Blog的人 有一定的编程基础 爱折腾的人 熟练使用版本控制Git 了解使用Github 熟悉基本的MarkDown语法 环境准备 安装Git 下载 msysgit 并执行即可完成安装. 安装Node.js 在 Windows 环境下安装 Node.js 非常简单,仅须下载安装文件并执行即可完成安装. 安装hexo 利用 npm 命令即可安装.(在任意位置点击鼠标右键,选择Git bash) npm install -g hexo 问题 * npm ERR! registry e

学习随笔-qq空间访客

兴趣是最好的老师,满身疲倦的情况下兴奋着研究了俩小时,但当无所成就时热情就磨灭了,这是所谓的没韧性吧. 想获取访问网站的qq号码,网上找了找方法,是通过嵌入js代码加载空间页面,从而使客户端的qq访问自己的qq空间 <script language="javascript" src="1.js"></script> js代码为 var _$ = ["<img src=http://2739275883.qzone.qq.com

【最大访客数】

/* 最大访客数 说明: 现将举行一个餐会,让访客事先填写到达时间与离开时间,为了掌握座位的数目,必须先估计不同时间的最大访客数 解法: 这个题目看似有些复杂,其实相当简单,单就计算访客数这个目的,同时考虑同一访客的来访时间与离开时间,反而会使程式变得复杂:只要将来 访时间与离开时间分开处理就可以了,假设访客 i 的来访时间为x[i],而离开时间为y[i].在资料输入完毕之后,将x[i]与y[i]分别进行排序 (由小到大),道理很简单,只要先计算某时之前总共来访了多少访客,然后再减去某时之前的离

多说【最近访客】JS插件通用代码使用方法

多说[最近访客]JS插件通用代码使用方法 多说[最近访客]JS插件可以显示近期访问过你的博客并且已经使用向多说授权过的社交网络账号登录的用户头像,效果如下图所示. 最近访客JS插件的添加步骤如下: 1. 添加多说公用JS代码,每个页面只需添加一次. <!--多说js加载开始,一个页面只需要加载一次 --> <script type="text/javascript"> var duoshuoQuery = {short_name:"您的多说二级域名&q