首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >PHP 获取用户行为参考代码 [IP/OS/URL/Broswer]

PHP 获取用户行为参考代码 [IP/OS/URL/Broswer]

作者头像
泥豆芽儿 MT
发布于 2018-09-11 03:40:33
发布于 2018-09-11 03:40:33
85500
代码可运行
举报
运行总次数:0
代码可运行

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://cloud.tencent.com/developer/article/1333870

♩ 背景

  • 一个成型的网站,经常需要统计用户的偏好行为,比如喜欢查看哪个页面,浏览哪类产品等,此时需要记录用户的行为,经过数据分析,从而获得有价值的信息,方便商家的策略定向
  • 下面,是自己测试整理后的部分代码: 可以帮助开发者获取用户的 IP、操作系统、访问 URL浏览器 等主要信息,可供参考…

♪ 主要方法展示

⑴. PHP 获取用户的IP地址

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
* 此方法返回用户的IP地址,同时如果拥有代理IP,将会以逗号追加在后面
* 如果只取用当前IP,可参考 :
* $ips = explode(',', $bargainModel->get_real_ips());
* $ip = $ips[0];
*/
public function get_real_ips()
    {
        global $ip;
        if (getenv("HTTP_CLIENT_IP")) {
            $ip = getenv("HTTP_CLIENT_IP");
        } else if (getenv("HTTP_X_FORWARDED_FOR")) {
            $ip = getenv("HTTP_X_FORWARDED_FOR");
        } else if (getenv("REMOTE_ADDR")) {
            $ip = getenv("REMOTE_ADDR");
        } else {
            $ip = "NULL";
        }
        return $ip;
    }

  1. 也可以参考这个获取方法 : PHP获取当前用户真实IP的方法
  2. 或者使用这个 ThinkPHP获取ip地址,或者数字地址和ip地理位置的查询
  3. 对于IP的存储,建议参考文章:ip2long 和 long2ip

⑵. PHP 获取当前页面 URL

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * PHP 获取当前页面 URL
 * @return string
 */
function currPageURL()
{
    $pageURL = 'http';
    if (!empty($_SERVER['HTTPS'])) {
        $pageURL .= "s";
    }
    $pageURL .= "://";
    if ($_SERVER["SERVER_PORT"] != "80") {
        $pageURL .= $_SERVER["SERVER_NAME"] . ":" . $_SERVER["SERVER_PORT"] . $_SERVER["REQUEST_URI"];
    } else {
        $pageURL .= $_SERVER["SERVER_NAME"] . $_SERVER["REQUEST_URI"];
    }
    return $pageURL;
}

获取到的结果类似:https://sinia.com/cart/show/id/292.html?ord_id=43

⑶. PHP 获取操作系统信息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
     * 获取客户端操作系统信息包括 win10
     * @param  null
     * @author  Jea杨
     * @return string
     */
    function getOS()
    {
        $agent = $_SERVER['HTTP_USER_AGENT'];
        $os = false;
        if (preg_match('/win/i', $agent) && strpos($agent, '95')) {
            $os = 'Windows 95';
        } else if (preg_match('/win 9x/i', $agent) && strpos($agent, '4.90')) {
            $os = 'Windows ME';
        } else if (preg_match('/win/i', $agent) && preg_match('/98/i', $agent)) {
            $os = 'Windows 98';
        } else if (preg_match('/win/i', $agent) && preg_match('/nt 6.0/i', $agent)) {
            $os = 'Windows Vista';
        } else if (preg_match('/win/i', $agent) && preg_match('/nt 6.1/i', $agent)) {
            $os = 'Windows 7';
        } else if (preg_match('/win/i', $agent) && preg_match('/nt 6.2/i', $agent)) {
            $os = 'Windows 8';
        } else if (preg_match('/win/i', $agent) && preg_match('/nt 10.0/i', $agent)) {
            $os = 'Windows 10';#添加win10判断  
        } else if (preg_match('/win/i', $agent) && preg_match('/nt 5.1/i', $agent)) {
            $os = 'Windows XP';
        } else if (preg_match('/win/i', $agent) && preg_match('/nt 5/i', $agent)) {
            $os = 'Windows 2000';
        } else if (preg_match('/win/i', $agent) && preg_match('/nt/i', $agent)) {
            $os = 'Windows NT';
        } else if (preg_match('/win/i', $agent) && preg_match('/32/i', $agent)) {
            $os = 'Windows 32';
        } else if (preg_match('/linux/i', $agent)) {
            $os = 'Linux';
        } else if (preg_match('/unix/i', $agent)) {
            $os = 'Unix';
        } else if (preg_match('/sun/i', $agent) && preg_match('/os/i', $agent)) {
            $os = 'SunOS';
        } else if (preg_match('/ibm/i', $agent) && preg_match('/os/i', $agent)) {
            $os = 'IBM OS/2';
        } else if (preg_match('/Mac/i', $agent) && preg_match('/PC/i', $agent)) {
            $os = 'Macintosh';
        } else if (preg_match('/PowerPC/i', $agent)) {
            $os = 'PowerPC';
        } else if (preg_match('/AIX/i', $agent)) {
            $os = 'AIX';
        } else if (preg_match('/HPUX/i', $agent)) {
            $os = 'HPUX';
        } else if (preg_match('/NetBSD/i', $agent)) {
            $os = 'NetBSD';
        } else if (preg_match('/BSD/i', $agent)) {
            $os = 'BSD';
        } else if (preg_match('/OSF1/i', $agent)) {
            $os = 'OSF1';
        } else if (preg_match('/IRIX/i', $agent)) {
            $os = 'IRIX';
        } else if (preg_match('/FreeBSD/i', $agent)) {
            $os = 'FreeBSD';
        } else if (preg_match('/teleport/i', $agent)) {
            $os = 'teleport';
        } else if (preg_match('/flashget/i', $agent)) {
            $os = 'flashget';
        } else if (preg_match('/webzip/i', $agent)) {
            $os = 'webzip';
        } else if (preg_match('/offline/i', $agent)) {
            $os = 'offline';
        } else {
            $os = 'Unknown';
        }
        return $os;
    }

  1. 当然,也可以使用内置的参数获取 <?PHP echo PHP_OS; ?>
  2. 可以参考文章: PHP 获取服务器操作系统等信息

⑷. PHP 获取浏览器信息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
     * 获取客户端浏览器信息
     * @param  null
     * @author  Jea杨
     * @return string
     */
public function getBroswer()
    {
        $user_OSagent = $_SERVER['HTTP_USER_AGENT'];
        if (strpos($user_OSagent, "Maxthon") && strpos($user_OSagent, "MSIE")) {
            $visitor_browser = "Maxthon(Microsoft IE)";
        } elseif (strpos($user_OSagent, "Maxthon 2.0")) {
            $visitor_browser = "Maxthon 2.0";
        } elseif (strpos($user_OSagent, "Maxthon")) {
            $visitor_browser = "Maxthon";
        } elseif (strpos($user_OSagent, "Edge")) {
            $visitor_browser = "Edge";
        } elseif (strpos($user_OSagent, "Trident")) {
            $visitor_browser = "IE";
        } elseif (strpos($user_OSagent, "MSIE")) {
            $visitor_browser = "IE";
        } elseif (strpos($user_OSagent, "MSIE")) {
            $visitor_browser = "MSIE";
        } elseif (strpos($user_OSagent, "NetCaptor")) {
            $visitor_browser = "NetCaptor";
        } elseif (strpos($user_OSagent, "Netscape")) {
            $visitor_browser = "Netscape";
        } elseif (strpos($user_OSagent, "Chrome")) {
            $visitor_browser = "Chrome";
        } elseif (strpos($user_OSagent, "Lynx")) {
            $visitor_browser = "Lynx";
        } elseif (strpos($user_OSagent, "Opera")) {
            $visitor_browser = "Opera";
        } elseif (strpos($user_OSagent, "MicroMessenger")) {
            $visitor_browser = "WeiXinBrowser";
        } elseif (strpos($user_OSagent, "Konqueror")) {
            $visitor_browser = "Konqueror";
        } elseif (strpos($user_OSagent, "Mozilla/5.0")) {
            $visitor_browser = "Mozilla";
        } elseif (strpos($user_OSagent, "Firefox")) {
            $visitor_browser = "Firefox";
        } elseif (strpos($user_OSagent, "U")) {
            $visitor_browser = "Firefox";
        } else {
            $visitor_browser = "Other Browser";
        }
        return $visitor_browser;
    }

♫ 测试参考:

  • 考虑实际开发,一般会设计各个页面继承某个公共类,然后在公共类的初始方法或构造函数中执行类似下面的逻辑处理,获取用户行为并记录到数据库,之后再进行数据读取后的展示设计…
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
* 仅供参考而已
*/
        $ips = explode(',', $this->get_real_ips());
        $ip = $ips[0];
        $browser = $this->getBroswer();
        $os = $this->getOS();
        $addData = [
            'uid' => $user_id,
            'curr_url' => $this->currPageURL(),
            'user_ip' => $ip,
            'os' => $os,
            'browser' => $browser,
            'add_time' => time(),
        ];
        M('user_behavior')
            ->add($addData);
  • 数据库中的记录参考:
  • 仅供参考,See You !
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018年04月20日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Hadoop源码篇--Reduce篇
Reduce文件会从Mapper任务中拉取很多小文件,小文件内部有序,但是整体是没序的,Reduce会合并小文件,然后套个归并算法,变成一个整体有序的文件。
LhWorld哥陪你聊算法
2018/09/13
7050
Hadoop源码篇--Reduce篇
MapReduce序列化(二)
在MapReduce中,通常使用Writable序列化数据。在Mapper中,用户将输入数据解析为键值对,并将键值对转换为自定义的Writable对象。在Reducer中,用户将Writable对象转换为输出键值对。下面是一个简单的例子:
堕落飞鸟
2023/05/12
2140
MapReduce编程规范(二)
Reduce函数是MapReduce的另一个核心组件,它负责将相同键的值合并,并生成最终输出。在编写Reduce函数时,需要注意以下几点:
堕落飞鸟
2023/05/12
2050
Hadoop: MapReduce2的几个基本示例
1) WordCount  这个就不多说了,满大街都是,网上有几篇对WordCount的详细分析 http://www.sxt.cn/u/235/blog/5809 http://www.cnblogs.com/zhanghuijunjava/archive/2013/04/27/3036549.html 这二篇都写得不错, 特别几张图画得很清晰 2) 去重处理(Distinct) 类似于db中的select distinct(x) from table , 去重处理甚至比WordCount还要简单,假如我
菩提树下的杨过
2018/01/19
1.1K0
一文学会MapReduce编程
MapReduce编程模型,相对于初学者来说,会有一些门槛,没关系,这一篇让你学会使用MapReduce进行分布式处理。
十里桃花舞丶
2021/01/06
5450
MapReduce编程规范(三)
计数器是MapReduce的一个重要组件,它用于跟踪MapReduce任务的进度和状态。开发人员可以定义自己的计数器,并在MapReduce程序中使用它们。在使用计数器时,需要注意以下几点:
堕落飞鸟
2023/05/12
2100
关于 hadoop reduce 阶段遍历 Iterable 的 2 个“坑”
之前有童鞋问到了这样一个问题:为什么我在 reduce 阶段遍历了一次 Iterable 之后,再次遍历的时候,数据都没了呢?可能有童鞋想当然的回答:Iterable 只能单向遍历一次,就这样简单的原因。。。事实果真如此吗? 还是用代码说话: package com.test; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class T { public static
用户1177713
2018/02/24
1.2K0
MapReduce实战-词频统计、文件合并排序
hadoop伪分布式集群环境,包括设置JAVA_HOME、HADOOP_HOME等。 可参考使用docker部署hadoop集群-手把手复现
唔仄lo咚锵
2021/12/31
7710
MapReduce实战-词频统计、文件合并排序
Hadoop(十六)之使用Combiner优化MapReduce
前言   前面的一篇给大家写了一些MapReduce的一些程序,像去重、词频统计、统计分数、共现次数等。这一篇给大家介绍的是关于Combiner优化操作。 一、Combiner概述 1.1、为什么需要Combiner   我们map任务处理的结果是存放在运行map任务的节点上。 map处理的数据的结果在进入reduce的时候,reduce会通过远程的方式去获取数据。   在map处理完数据之后,数据量特别大的话。reduce再去处理数据它就要通过网络去获取很多的数据。   这样会导致一个问题是:大量的数据
用户1195962
2018/01/18
1.5K0
Hadoop(十六)之使用Combiner优化MapReduce
MapReduce Combiner
MapReduce Combiner是一个可选的组件,它与Mapper和Reducer组件类似,可以接收键值对作为输入,并输出相同或不同的键值对。Combiner通常用于对Mapper产生的中间数据进行本地聚合,以减少Mapper产生的中间数据的数量,并将更少的数据发送给Reducer,从而减少网络传输和存储负载。Combiner是在Mapper和Reducer之间运行的,并且只在Mapper端运行,不会在Reducer端运行。Combiner的输出会作为Mapper的输出写入到本地磁盘中,等待Reducer进行最终的聚合。
堕落飞鸟
2023/05/12
5230
大数据技术入门:MapReduce(分布式计算框架)
MapReduce是一种编程模型,用于大规模数据集(大于1TB)的并行运算。概念"Map(映射)“和"Reduce(归约)”,是它们的主要思想,都是从函数式编程语言里借来的,还有从矢量编程语言里借来的特性。它极大地方便了编程人员在不会分布式并行编程的情况下,将自己的程序运行在分布式系统上。 当前的软件实现是指定一个Map(映射)函数,用来把一组键值对映射成一组新的键值对,指定并发的Reduce(归约)函数,用来保证所有映射的键值对中的每一个共享相同的键组。——来源于百度百科。
百思不得小赵
2022/12/01
6.5K0
大数据技术入门:MapReduce(分布式计算框架)
编写MapReduce程序
Map阶段由一定数量的Map Task组成 输入数据格式解析:InputFormat 输入的数据处理 :Mapper 输入数据分组 :Partitioner 数据的拷贝与按key排序 数据处理 :Reducer 数据的输出格式 :outputFormat
Tim在路上
2020/08/04
5830
Java编写Hadoop第一个MapReduce任务
因为在做网站案例的时候,想学习如何处理海量数据,所以想接触大数据相关的知识,之前对于大数据的了解,仅仅是停留在知道Hadoop,Hive,HBase,Spark的层面上,所以如何学习确实对我造成了困扰,所幸我所在公司部门存在大数据开发,于是不断的请教大佬,大佬说第一步是学一点Linux和Java,然后Hadoop,再然后......。再然后就先不说了,对于Linux和Java我这里可以直接跨过了,然后就是学Hadoop。这周利用散碎的时间,学会了Hadoop的安装使用,使用Java写一个Hadoop任务。安装这里我就不说了,大家可以去网上搜索,或者来我的网站文章模块看我如何安装(Mac): 网址:www.study-java.cn来看一下(需要打开微信小程序:每天学Java进行扫码登录)
每天学Java
2020/06/01
1.5K0
使用Hadoop MapReduce进行大规模数据爬取
Hadoop MapReduce是一个编程模型,用于处理和生成大数据集。它由Map和Reduce两个主要阶段组成。Map阶段负责处理输入数据,并将结果输出为键值对;Reduce阶段则对Map阶段的输出进行汇总和合并,生成最终结果。
小白学大数据
2024/12/05
1860
Hadoop的mapreduce的简单用法 原
  Mapreduce是一个计算框架,既然是做计算的框架,那么表现形式就是有个输入(input),mapreduce操作这个输入(input),通过本身定义好的计算模型,得到一个输出(output),这个输出就是我们所需要的结果。
用户2603479
2018/09/19
7810
BigData--MapReduce入门
MapReduce是一个分布式运算程序的编程框架,是用户开发“基于Hadoop的数据分析应用”的核心框架。
MiChong
2020/09/24
3680
BigData--MapReduce入门
【小白视角】大数据基础实践(五) MapReduce编程基础操作
ResourceManager • 处理客户端请求 • 启动/监控ApplicationMaster • 监控NodeManager • 资源分配与调度 NodeManager • 单个节点上的资源管理 • 处理来自ResourceManger的命令 • 处理来自ApplicationMaster的命令 ApplicationMaster • 为应用程序申请资源,并分配给内部任务 • 任务调度、监控与容错
全栈程序员站长
2022/06/28
6510
【小白视角】大数据基础实践(五) MapReduce编程基础操作
[Mapreduce]eclipse下写wordcount「建议收藏」
注:eclipse下初次执行wordcount可能会有log4j警告。能够在src下建立名为log4j.properties的文件,就可以消除警告,内容例如以下:
全栈程序员站长
2022/07/10
3560
MapReduce:随机生成100个小数并求最大值
在编写MapReduce的时候,自带的输入格式有时候满足不了我们的需求,这就需要自己定义InputFormat,InputSplit和RecordReader。
小爷毛毛_卓寿杰
2019/02/13
7230
运行Hadoop自带的单词统计程序
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64 export PATH=JAVA_HOME/bin:PATH export CLASSPATH=.:JAVA_HOME/lib/dt.jar:JAVA_HOME/lib/tools.jar
zhangjiqun
2024/12/17
1250
运行Hadoop自带的单词统计程序
相关推荐
Hadoop源码篇--Reduce篇
更多 >
LV.2
这个人很懒,什么都没有留下~
交个朋友
加入腾讯云官网粉丝站
蹲全网底价单品 享第一手活动信息
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档