超时以微秒为单位。
1,000,000 微秒 = 1 秒
(PHP 4, PHP 5, PHP 7, PHP 8)
snmpwalk — 从代理获取所有 SNMP 对象
$hostname
,$community
,$object_id
,$timeout
= -1,$retries
= -1
snmpwalk() 函数用于读取由 hostname
指定的 SNMP 代理中的所有值。
hostname
SNMP 代理(服务器)。
community
读取社区。
object_id
如果为 null
,则将 object_id
视为 SNMP 对象树的根,并将该树下所有对象作为数组返回。
如果指定了 object_id
,则返回该 object_id
下的所有 SNMP 对象。
timeout
第一次超时之前的微秒数。
retries
如果发生超时,重试的次数。
返回一个 SNMP 对象值的数组,从 object_id
作为根开始,或者在错误时返回 false
。
示例 #1 snmpwalk() 示例
<?php
$a = snmpwalk("127.0.0.1", "public", "");
foreach ($a as $val) {
echo "$val\n";
}
?>
上面的函数调用将返回运行在 localhost 上的 SNMP 代理中的所有 SNMP 对象。可以使用循环遍历这些值。
请注意,php snmpwalk 和 ucd snmpwalk 的行为有所不同。如果你尝试遍历一个 oid,该 oid 的一个值不在遍历的 oid 的子键下,ucd snmpwalk 将返回该值,而 php 的 snmpwalk 则不会。
能够指定要使用的 snmp 版本(1、2c、3)会很好。
目前,它在 ext/snmp/snmp.c 中是硬编码的。
如果目前需要,请将 session.version 从 1 更改为 2c 或 3。
例如
session.version = SNMP_VERSION_1;
改为
session.version = SNMP_VERSION_2c;
处理 snmpwalk 时需要注意的一点:<BR>
遍历 MIB 时,snmpwalk 将信息放入数组中,这是正确的。<BR>
问题发生在 snmpwalk 需要从包含子实例的实例中收集信息时(例如,遍历 .1.2.3.4.5 并具有 1.1、1.2、1.3 等实例):在这种情况下,它会获取信息并将其传递给数组,但遍历数组时,每个值之前都带有“Counter32:”。<BR>
我已经用多种方法测试过,结果都是一样的。
啊,这就是为什么我们所有的 SNMP 东西在系统有任何负载时都会超时。唉,浪费了两周时间来调试 snmp....
即使是 snmpcmd 手册页也没有给出
超时的单位。
对于想知道
超时字段以什么为单位测量的海报
来自 ucd-snmp 头文件 snmp_api.h
long timeout;
/* 第一次超时之前的 uS 数
然后是指数退避 */
快速路由器设备视图
<?
include "header.html";
$host = "auscr1";
$community = "tellme";
$sysDescr = snmpget("$host","$community","system.sysDescr.0");
$ifDescr = snmpwalk("$host","$community","interfaces.ifTable.ifEntry.ifDescr");
$ifIndex = snmpwalk("$host","$community","interfaces.ifTable.ifEntry.ifIndex");
$ifAdminStatus = snmpwalk("$host","$community","interfaces.ifTable.ifEntry.ifAdminStatus");
$ifOperStatus = snmpwalk("$host","$community","interfaces.ifTable.ifEntry.ifOperStatus");
$ifLastChange = snmpwalk("$host","$community","interfaces.ifTable.ifEntry.ifLastChange");
print "<table border=1 bgcolor=#ffffff><tr><td>$host</td></tr></table><br>";
print "<table border=1 bgcolor=#ffffff><tr><td>$sysDescr</td></tr></table><br>";
print "<table border=1 bgcolor=#ffffff>";
print "<tr>
<td>ifIndex</td>
<td>ifDescr</td>
<td>ifAdminStatus</td>
<td>ifOperStatus</td>
<td>ifLastChange</td>
</tr>";
for ($i=0; $i<count($ifIndex); $i++) {
print "<tr>";
print "<td>$ifIndex[$i]</td>";
print "<td>$ifDescr[$i]</td>";
print "<td>$ifAdminStatus[$i]</td>";
print "<td>$ifOperStatus[$i]</td>";
print "<td>$ifLastChange[$i]</td>";
print "</tr>";
}
print "</table>";
?>
我在 Windows(PHP 5)上发现空字符串没有返回任何内容,它只是超时。我不得不使用 null 代替
<?php
$a = snmpwalk("127.0.0.1", "public", null);
?>
我不得不使用像这样的 object_id。
'SNMPv2-MIB::system.sysDescr.0'
'IF-MIB::interfaces.ifTable.ifEntry.ifAdminStatus'
<?php
$host = '192.168.1.1';
$community = 'public';
$object_id = 'IF-MIB::interfaces.ifTables.ifEntry.ifAdminStatus';
$sysdesc = snmpwalk($host, $community', $object_id);
print_r($sysdesc);
?>