PHP 获取计算机唯一标识:CPU ID 与网卡 MAC 地址

苏见山
苏见山
发布时间:2026-10-15 | 4人浏览过
原创

在 Web 开发中,有时需要根据服务器的硬件特征生成唯一标识,例如用于软件授权验证或设备指纹识别。本文将演示如何使用 PHP 调用操作系统底层命令来提取 CPU 序列号和网卡物理地址(MAC),确保代码在不同环境下具备较好的兼容性。

获取 CPU 唯一标识 (CPU ID)

CPU 标识通常可以通过 Windows 系统的 wmic 命令获取。由于不同服务器环境对系统函数的支持情况不同,以下代码兼顾了 exec 和 system 两种路径,优先使用输出捕获更灵活的 exec,若不可用则降级使用 system 配合输出缓冲。

第1步:定义获取 CPU ID 的函数

该函数首先检查服务器是否允许执行外部命令。如果允许,它尝试解析命令输出以找到包含 "ProcessorId" 的行,并提取其后的值作为 CPU ID。

function getCPUID() {
    $a = '';
    $b = array();
    
    // 优先尝试使用 exec
    if (function_exists('exec')) {
        // 注意:Windows 下 wmic cpu get ProcessorId /value 是常用命令
        // 这里为了兼容原意,保留对输出数组 b 的处理逻辑
        if (!@exec('wmic cpu get ProcessorId /value', $b)) {
            return false;
        }
    } elseif (function_exists('system')) {
        // 降级方案:使用 system + ob_start
        ob_start();
        if (!@system('wmic cpu get ProcessorId /value')) {
            return false;
        } else {
            $output = ob_get_contents();
            ob_end_clean();
            // 将 system 输出的字符串拆分为数组处理
            $b = explode("\n", $output);
            array_pop($b); // 移除末尾空行
        }
    } else {
        return false;
    }

    // 遍历输出行,寻找关键数据
    $all = sizeof($b);
    for ($i = 0; $i < $all; $i++) {
        // 根据 wmic 输出格式调整匹配逻辑
        // 原代码匹配 Description 可能不适用于所有 wmic 版本,此处修正为通用逻辑
        if (strpos($b[$i], "ProcessorId") !== false) {
            if (isset($b[$i+1])) {
                $c = explode("=", $b[$i+1]);
                $a = trim($c[1]);
                break;
            }
        }
    }
    
    return empty($a) ? false : $a;
}

获取网卡 MAC 地址

网卡的物理地址(MAC)同样可以通过网络配置查询命令获得。在 Windows 系统中,ipconfig /all 是最常用的命令。MAC 地址通常标记为 "Physical Address"。

第2步:定义获取 MAC 地址的函数

此函数直接调用 exec 获取全部网络配置信息,然后逐行查找包含 "Physical" 关键字的行,分割并返回对应的 MAC 地址值。注意:如果服务器有多个网卡,该方法仅返回第一个找到的结果。

function getMACAddress() {
    @exec('ipconfig /all', $array);
    
    foreach ($array as $line) {
        // 使用 strpos 替代已废弃的 eregi
        if (strpos($line, 'Physical') !== false) {
            $parts = explode(':', $line);
            if (isset($parts[1])) {
                return trim($parts[1]);
            }
        }
    }
    return false;
}

注意事项与排错

  • 权限限制:PHP 运行在 Web 服务器环境下,必须确保 php.ini 中的 disable_functions 未禁用 exec、system 等函数,否则无法获取系统信息。
  • 操作系统差异:上述代码主要针对 Windows 环境(使用 wmic 和 ipconfig)。在 Linux/Unix 系统中,应改用 cat /proc/cpuinfo 或 ifconfig -a 等命令进行相应适配。
  • 正则函数替换:原文草稿中使用的 eregi 函数在较新版本的 PHP 中已被废弃,代码中已替换为标准的 strpos 或 preg_match 以确保持久可用。

以上就是通过 PHP 获取计算机 CPU ID 和 MAC 地址的详细内容,更多关于 PHP 系统级操作资料请关注本站其它相关文章!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表