php无法直接读取风扇故障信号,必须通过exec()等调用lm_sensors、ipmitool或wmi等外部工具;关键依据是alarm:字段而非rpm值,且需确保权限、硬件支持及输出格式兼容性。

PHP 本身不能直接读取风扇故障报警信号。 它没有内建硬件访问能力,也不具备操作系统级的传感器驱动接口权限。所有所谓“PHP 检测风扇异常”的方案,本质都是靠外部工具或系统接口中转,PHP 只负责调用和解析结果。
为什么 exec() 或 shell_exec() 是唯一可行路径
Linux 系统下风扇状态(如 RPM、故障标志)通常由 lm_sensors、ipmitool 或 /sys/class/hwmon/ 下的虚拟文件暴露。Windows 则依赖 WMI 查询。PHP 没有原生函数对应这些机制,只能委托 shell 执行底层命令。
- 必须确保 PHP 进程有执行对应命令的权限(例如
ipmitool需 root 或特定用户组) - Web 服务器(如 Apache/Nginx + PHP-FPM)默认以低权限用户运行,常因权限不足返回空结果或报错
Command not found -
exec("sensors -u")返回的是多行文本,不是结构化数据,需手动解析 —— 比如找包含fan1_input:和紧随其后的alarm:行 - 某些主板 BIOS 关闭了 IPMI 或传感器支持,
ipmitool sdr type fan可能直接报Unable to establish IPMI v2 / RMCP+ session
lm_sensors 输出里怎么识别真实风扇故障
sensors 命令输出易受配置影响,alarm: 字段才是关键依据,而非单纯看 RPM 是否为 0。很多风扇在待机时 RPM 为 0 属正常,但 alarm: 1 才表示硬件上报了故障。
- 运行
sensors -u后,定位类似fan1:的 section,再找它下面的alarm:行(值为 0 或 1) - RPM 值在
input:行,但部分芯片(如 it87)会把风扇停转误报为input: 0.00,而alarm:更可靠 - 不同传感器芯片字段名不一致:nct6775 可能叫
fan1_alarm,coretemp 不提供风扇信息 —— 不能硬编码字段名,得先sensors -l查设备列表 - 注意单位:有些输出带
kRPM,数值是千转,input: 1.20实际是 1200 RPM
PHP 调用 ipmitool 读取风扇 SDR 的典型陷阱
IPMI 是服务器级硬件监控主流方式,但对环境依赖极强。PHP 调用失败,90% 不是代码问题,而是前置条件没满足。
- 必须确认 BMC 已启用 IPMI,并且本地通过
ipmitool -I open chassis status能通 —— 否则 PHP 里exec("ipmitool sdr type fan")会卡住或超时 - 部分主板(尤其消费级)压根没 BMC,
modprobe ipmi_si加载失败,/dev/ipmi0不存在,ipmitool直接退出码 1 - SDR 输出格式不固定:
FAN1 | 3200 RPM | ok中的ok可能变成nc(not connected)、lr(lower critical)等,需匹配多个关键词 - PHP 默认
exec()不设超时,BMC 响应慢时会导致 Web 请求 hang 死,务必用proc_open()控制超时或加timeout 5前缀
真正难的从来不是写几行 exec(),而是判断当前机器有没有可用传感器、权限是否放开、输出格式是否稳定。同一段代码,在 Dell R740 上跑通,在某款工控机上连 sensors 命令都找不到 —— 这才是落地时最常卡住的地方。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











