PHP 8在RHEL 9.5中无法自动加载/usr/share/snmp/mibs目录下的MIB文件
我之前帮同行排查过类似的迁移问题,PHP 8在RHEL 9.5上确实调整了SNMP扩展加载MIB文件的默认逻辑,不像PHP 7.2那样自动识别系统默认的/usr/share/snmp/mibs目录了。咱们可以从这几个实用的方向来解决:
在PHP代码中手动指定MIB目录
最直接的方式就是在代码开头用snmp_set_environment()函数设置MIBDIRS环境变量,直接指向系统的MIB存储目录。把这行代码加在你的业务逻辑之前就行:snmp_set_environment('MIBDIRS', '/usr/share/snmp/mibs');修改后的完整代码示例:
<?php snmp_set_environment('MIBDIRS', '/usr/share/snmp/mibs'); $host = "10.0.1.4"; $com = "redacted"; $oid = "ipRouteMask"; if ($arry = snmprealwalk ($host, $com, $oid)) { echo ""; } else { echo "Error, could not retrieve a list of routes from $host."; }修改系统SNMP全局配置
如果你不想在每个PHP项目里都加代码,可以直接调整系统级的SNMP配置文件。编辑/etc/snmp/snmp.conf,在文件里添加一行:mibdirs /usr/share/snmp/mibs保存后重启你的PHP相关服务(比如php-fpm或者Apache/httpd,根据你的运行环境来),这样PHP的SNMP扩展就会默认读取这个配置里指定的MIB目录了,所有项目都能生效。
检查SNMP扩展的编译参数(备选方案)
少数情况下,PHP 8的SNMP扩展在编译时可能没包含系统默认MIB目录的支持。你可以在PHP里打印phpinfo(),找到SNMP模块的配置信息,看看有没有--with-mibdirs相关的编译参数。如果确实没有,可能需要重新编译SNMP扩展并加上--with-mibdirs=/usr/share/snmp/mibs参数,但这个方法比较繁琐,一般前两个方法就能解决问题,除非你有特殊的环境需求。
另外可以先做个小测试:用系统命令行的snmpwalk工具执行snmpwalk -v 2c -c redacted 10.0.1.4 ipRouteMask,如果命令行能正常获取数据,那基本可以确定就是PHP里的MIB目录配置问题,按上面的方法调整就行。
备注:内容来源于stack exchange,提问作者ZCT

