php无法直接获取硬盘型号,必须通过系统命令:linux下用lsblk和udevadm组合查找首个物理磁盘并读取id_model,windows下用wmic(需处理编码与权限),但受容器、权限及raid限制,生产环境应交由监控agent提供api。

PHP 无法直接识别硬盘型号,必须调用系统命令
PHP 本身没有内置函数能读取硬盘型号(如 WD40EFRX 或 ST2000DM008),disk_free_space() 和 disk_total_space() 只返回容量,sys_getloadavg() 等更不相关。真实路径只有一条:让 PHP 执行底层命令并解析输出。
常见错误是试图用 fopen('/sys/block/sda/device/model') —— 这在大多数 Web 环境会失败:Web 服务器(如 www-data)通常无权读取 /sys 下的设备节点,且路径依赖设备名(sda 不一定存在,可能是 nvme0n1)。
- Linux 下优先用
lsblk -d -o NAME,MODEL,TRAN,TYPE(需 root 权限才显示完整 MODEL;普通用户可能为空) - 更可靠的是
udevadm info --name=/dev/sda --query=property | grep ID_MODEL,但需知道具体设备路径 - Windows 下只能走
WMI,用shell_exec('wmic diskdrive get model,serialnumber'),注意编码和空格截断问题
如何安全获取第一个物理硬盘型号(Linux + PHP)
不能硬写 /dev/sda——容器、云主机、RAID 卡下设备名不可预测。得先找“真正的磁盘”,排除 loop、ram、zram、nvme-part 等虚拟设备。
推荐组合命令:lsblk -d -n -o NAME,ROTA,TYPE | awk '$2==1 && $3=="disk" {print $1; exit}'(找第一个旋转磁盘),再拼接 udev 查询:
shell_exec("udevadm info --name=/dev/$(lsblk -d -n -o NAME,ROTA,TYPE | awk '\$2==1 && \$3==\"disk\" {print \$1; exit}') --query=property 2>/dev/null | grep '^ID_MODEL=' | cut -d= -f2- | tr -d '\n'")
注意点:
-
2>/dev/null必须加,否则权限不足时会返回错误文本干扰结果 -
tr -d '\n'防止换行符混入返回值 - 若返回空,大概率是权限问题或 SSD(ROTA=0),可改用
ID_SERIAL_SHORT或 fallback 到smartctl -i /dev/sda 2>/dev/null | grep 'Device Model'(需安装 smartmontools)
Windows 下 wmic 命令的坑与绕过方式
wmic 在 PHP 中常返回空或乱码,主因是 cmd 默认编码为 GBK,而 PHP 输出是 UTF-8,且 wmic 自带多余空行和标题行。
实操建议:
- 强制指定代码页:
shell_exec('chcp 65001 >nul && wmic diskdrive get model /format:csv 2>NUL') - 用
/format:csv避免列对齐问题,再用 PHP 的str_getcsv()解析 - 过滤掉第一行(标题)和空行:
array_slice(array_filter(str_getcsv($output)), 1) - 若仍为空,检查 IIS/Apache 是否以 SYSTEM 账户运行——非交互式服务账户默认无 WMI 权限,需手动授权或改用 PowerShell
权限、容器与生产环境的现实约束
本地开发能跑通,不等于线上可用。核心限制不是技术,是部署模型:
- Docker 容器默认禁止访问
/sys和/dev,需加--privileged或挂载--device=/dev/sda:/dev/sda:r(极不推荐) - 共享主机(cPanel、Plesk)几乎必然禁用
shell_exec,此时方案直接失效 - 即使命令成功,返回的“型号”也未必是物理盘——RAID 卡(如 MegaRAID)返回的是卡型号(
DELL PERC H730),而非后端硬盘 - NVMe 盘的
ID_MODEL常被固件留空,smartctl -i是唯一靠谱手段,但需额外安装和 root 权限
真正稳定的做法,是把硬件探测下沉到部署脚本或监控 agent(如 Prometheus node_exporter),PHP 应只消费 API,而不是自己扒 sysfs。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











