PHP获取手机终端信息类封装实例

阿橙
阿橙
发布时间:2026-10-15| 6人浏览过
原创

本文介绍了一个基于PHP的移动端信息处理类,旨在从服务器环境中提取手机型号、用户代理、网络IP及可能的运营商号码等关键标识信息,以便开发者针对不同终端设备进行内容适配。

实现目标与核心功能

在Web开发中,尤其是早期的移动Web应用,准确识别访问者所使用的设备类型、操作系统及网络状态是优化用户体验的关键。本示例代码封装了一个名为 mobile 的类,主要解决以下问题:

  • 识别终端的品牌或型号(Phone Type)。
  • 获取完整的用户代理字符串(User-Agent)。
  • 判断特定的浏览器内核(如Opera)。
  • 尝试获取手机号(依赖运营商网关透传的头信息)。
  • 获取客户端真实IP地址。

环境准备

该脚本运行于标准的PHP环境中。由于依赖HTTP请求头中的特殊字段,部分功能(如获取手机号)需要在支持相应网关透传的运营商网络环境下测试,常规公网请求可能无法获取到隐私相关的手机号信息。确保服务器配置允许访问 $_SERVER 数组。

代码实现与操作说明

第1步:初始化 mobile 类并获取 HTTP 头信息

首先定义类结构,并提供一个通用方法用于遍历所有服务器环境变量。这有助于调试和查看当前请求携带的所有头部信息。

复制代码 代码如下:
<?php
class mobile {
    /**
     * 函数名称: getHttpHeader
     * 函数功能: 取头信息
     * 输入参数: none
     * 函数返回值: 成功返回包含所有 Server 变量的字符串,失败返回空
     */
    function getHttpHeader() {
        $str = '';
        foreach ($_SERVER as $key=> $val){
            $gstr = str_replace ("&", "&",$val);
            $str.= "$key -> ".htmlspecialchars($gstr). "\n";
        }
        Return $str;
    }
}

第2步:获取 User-Agent (UA)

User-Agent 是识别浏览器和操作系统的最主要依据。此方法直接从 $_SERVER['HTTP_USER_AGENT'] 中读取。

复制代码 代码如下:
    /**
     * 函数名称: getUA
     * 函数功能: 取UA
     * 输入参数: none
     * 函数返回值: 成功返回字符串,失败返回 false
     */
    function getUA(){
        if (isset($_SERVER[ 'HTTP_USER_AGENT '])){
            Return $_SERVER[ 'HTTP_USER_AGENT '];
        }else{
            Return false;
        }
    }

第3步:分析手机类型

基于上一步获取的 UA 字符串,按空格分割通常能拿到设备厂商或型号的开头部分。例如 iPhone 或 Samsung 的前缀。

复制代码 代码如下:
    /**
     * 函数名称: getPhoneType
     * 函数功能: 取得手机类型
     * 输入参数: none
     * 函数返回值: 成功返回 string,失败返回 false
     */
    function getPhoneType(){
        $ua = $this-> getUA();
        if($ua!=false){
            $str = explode( ' ',$ua);
            Return $str[0];
        }else{
            Return false;
        }
    }

第4步:判断特定浏览器或网关

通过正则匹配 UA 字符串,可以识别是否使用了 Opera 浏览器或 M3Gate 等特定网关服务。这在早期wap站开发中较为常见。

复制代码 代码如下:
    /**
     * 函数名称: isOpera
     * 函数功能: 判断是否是opera
     * 输入参数: none
     * 函数返回值: 成功返回 true/false
     */
    function isOpera(){
        $uainfo = $this-> getUA();
        if (preg_match( '/.*Opera.*/i ',$uainfo)){
            Return true;
        }else{
            Return false;
        }
    }

    /**
     * 函数名称: isM3gate
     * 函数功能: 判断是否是m3gate
     * 输入参数: none
     * 函数返回值: 成功返回 true/false
     */
    function isM3gate(){
        $uainfo = $this-> getUA();
        if (preg_match( '/M3Gate/i ',$uainfo)){
            Return true;
        }else{
            Return false;
        }
    }

第5步:获取客户端 IP 地址

考虑到反向代理和负载均衡的存在,优先检查 X-Forwarded-For,若不存在则回退到 REMOTE_ADDR。注意:该方法未做严格的安全过滤,仅用于展示原始IP逻辑。

复制代码 代码如下:
    /**
     * 函数名称: getIP
     * 函数功能: 取得手机IP
     * 输入参数: none
     * 函数返回值: 成功返回 string
     */
    function getIP(){
        $ip=getenv( 'REMOTE_ADDR ');
        $ip_ = getenv( 'HTTP_X_FORWARDED_FOR ');
        if ( ($ip_ != " ") && ($ip_ != "unknown")){
            $ip=$ip_;
        }
        return $ip;
    }

第6步:尝试获取手机号码

此功能具有高度依赖性。它依赖于运营商网关在HTTP请求中添加的特殊Header(如 HTTP_X_NETWORK_INFO、HTTP_X_UP_CALLING_LINE_ID 等)。在现代移动互联网环境中,出于隐私保护,这些字段往往不再默认透传至Web服务器,因此该方法的可用性取决于具体的运营商和网络环境。

复制代码 代码如下:
    /**
     * 函数名称: getPhoneNumber
     * 函数功能: 取手机号
     * 输入参数: none
     * 函数返回值: 成功返回号码,失败返回 false
     */
    function getPhoneNumber(){
        if (isset($_SERVER[ 'HTTP_X_NETWORK_INFO '])){
            $str1 = $_SERVER[ 'HTTP_X_NETWORK_INFO '];
            // 尝试从复杂格式中提取11位手机号
            $getstr1 = preg_replace( '/(.*,)(11[d])(,.*)/i ', '2 ',$str1);
            Return $getstr1;
        }elseif (isset($_SERVER[ 'HTTP_X_UP_CALLING_LINE_ID '])){
            $getstr2 = $_SERVER[ 'HTTP_X_UP_CALLING_LINE_ID '];
            Return $getstr2;
        }elseif (isset($_SERVER[ 'HTTP_X_UP_SUBNO '])){
            $str3 = $_SERVER[ 'HTTP_X_UP_SUBNO '];
            $getstr3 = preg_replace( '/(.*)(11[d])(.*)/i ', '2 ',$str3);
            Return $getstr3;
        }elseif (isset($_SERVER[ 'DEVICEID '])){
            Return $_SERVER[ 'DEVICEID '];
        }else{
            Return false;
        }
    }

使用示例与注意事项

在实际项目中,您可以实例化此类并根据需求调用对应的方法:

复制代码 代码如下:
$device = new mobile();
if (!$device->getPhoneNumber()) {
    echo "当前环境不支持自动获取手机号";
} else {
    echo "手机号: " . $device->getPhoneNumber();
}

$type = $device->getPhoneType();
if ($type) {
    echo "设备类型初步识别为: " . $type;
}

风险提示: 直接输出 $_SERVER 中的原始数据存在XSS风险。在生产环境中,请务必对所有返回值进行 htmlspecialchars() 转义处理。此外,依赖非标准HTTP头获取手机号的做法不符合现代隐私合规要求,不建议在新项目中用于生产业务。

总结

上述代码提供了一种轻量级的服务端设备检测方案,涵盖了基础的UA解析、IP获取及部分专用Header解析。虽然针对现代主流浏览器的兼容性需要更复杂的UA库(如Browscap)来支撑,但此类简单逻辑仍可用于快速判断基础的设备大类或特定遗留环境的兼容。以上就是PHP实现读取手机客户端浏览器及获取手机信息的详细内容,更多关于PHP移动端开发、UA识别的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。