ocolin/easysnmp
Composer 安装命令:
composer require ocolin/easysnmp
包简介
PHP SNMP client providing formatted, DTO-backed access to standard MIB-II data without requiring SNMP knowledge
README 文档
README
Warning
v3.0.0 is a complete rewrite and is not compatible with v1.x or v2.x.
Requires PHP 8.4+ and FreeDSx SNMP.
ocolin/easysnmp
A PHP SNMP client that provides formatted, DTO-backed access to standard MIB-II data without requiring SNMP knowledge. Pass in your authentication credentials, call a method, get structured data back.
Built on top of FreeDSx SNMP.
Requirements
- PHP 8.4+
- FreeDSx SNMP
^0.5.1 - ocolin/global-type
^2.0
Installation
composer require ocolin/easysnmp
Configuration
Configuration is handled by the Config class. Credentials can be passed
explicitly or read automatically from environment variables.
Explicit configuration
use Ocolin\EasySNMP\Config; use Ocolin\EasySNMP\EasySNMP; $config = new Config( host: '10.0.0.1', community: 'public' ); $snmp = new EasySNMP( config: $config );
Environment variables
If no explicit values are passed, Config falls back to environment variables
using the EASY_SNMP_ prefix by default:
// Reads from EASY_SNMP_* environment variables $snmp = new EasySNMP( config: new Config() ); // Or alternatively $snmp = new EasySNMP();
Multiple devices with prefixes
When monitoring multiple devices, use the $prefix parameter to namespace
your environment variables:
JUNIPER_SNMP_HOST=10.0.0.1 JUNIPER_SNMP_COMMUNITY=public MIKROTIK_SNMP_HOST=10.0.0.2 MIKROTIK_SNMP_COMMUNITY=private
$juniper = new EasySNMP( config: new Config( prefix: 'JUNIPER' ) ); $mikrotik = new EasySNMP( config: new Config( prefix: 'MIKROTIK' ) );
Prefix values are case-insensitive — 'juniper' and 'JUNIPER' both resolve
to JUNIPER_SNMP_*.
Configuration reference
The EASY prefix in all ENV variable names is replaced by your custom prefix
when using the $prefix parameter. For example, with prefix: 'JUNIPER' the
variable EASY_SNMP_HOST becomes JUNIPER_SNMP_HOST.
| ENV Variable | Constructor Argument | Type | Default | Description |
|---|---|---|---|---|
EASY_SNMP_HOST |
$host |
?string |
null |
Hostname or IP of device |
EASY_SNMP_COMMUNITY |
$community |
?string |
null |
SNMP v1/v2c community string |
EASY_SNMP_PORT |
$options['port'] |
?int |
161 |
SNMP port |
EASY_SNMP_VERSION |
$options['version'] |
?int |
2 |
SNMP version (1, 2, 3) |
EASY_SNMP_TIMEOUT_CONNECT |
$options['timeout_connect'] |
?int |
5 |
Connection timeout in seconds |
EASY_SNMP_TIMEOUT_READ |
$options['timeout_read'] |
?int |
10 |
Read timeout in seconds |
EASY_SNMP_USER |
$options['user'] |
?string |
null |
SNMPv3 username |
EASY_SNMP_AUTH_PWD |
$options['auth_pwd'] |
?string |
null |
SNMPv3 auth password |
EASY_SNMP_PRIV_PWD |
$options['priv_pwd'] |
?string |
null |
SNMPv3 privacy password |
EASY_SNMP_AUTH_MECH |
$options['auth_mech'] |
?string |
null |
SNMPv3 auth mechanism |
EASY_SNMP_PRIV_MECH |
$options['priv_mech'] |
?string |
null |
SNMPv3 privacy mechanism |
EASY_SNMP_ENGINE_ID |
$options['engine_id'] |
?string |
null |
SNMPv3 engine ID |
EASY_SNMP_CONTEXT_NAME |
$options['context_name'] |
?string |
null |
SNMPv3 context name |
EASY_SNMP_USE_AUTH |
$options['use_auth'] |
?bool |
null |
Enable SNMPv3 authentication |
EASY_SNMP_USE_PRIV |
$options['use_priv'] |
?bool |
null |
Enable SNMPv3 privacy |
Usage
System information
$system = $snmp->getSystem(); echo $system->name; // Router-01 echo $system->descr; // Linux Router 5.15.0 echo $system->location; // Server Room A echo $system->contact; // admin@example.com echo $system->upTime; // TimeTicks integer echo $system->objectId; // 1.3.6.1.4.1.14988.1 // Formatted version: $system = Format::System( $snmp->getSystem());
Interface table (ifTable)
$interfaces = $snmp->getIfTable(); foreach( $interfaces as $interface ) { echo $interface->index; // Interface index echo $interface->description; // Interface description echo $interface->speed; // Speed in bps echo $interface->adminStatus; // Raw integer (1=up, 2=down, 3=testing) echo $interface->operStatus; // Raw integer (1=up, 2=down, etc.) echo $interface->macAddress; // Raw MAC address } // Formatted version: $interfaces = Format::IfTables( $snmp->getIfTable());
Fetch only specific columns to reduce SNMP calls:
$interfaces = $snmp->getIfTable( columns: ['description', 'operStatus'] );
Extended interface table (ifXTable)
$interfaces = $snmp->getIfXTable(); foreach( $interfaces as $interface ) { echo $interface->name; // Interface name echo $interface->alias; // Administrator-set alias echo $interface->highSpeed; // Speed in Mbps echo $interface->inHcOctets; // 64-bit input byte counter echo $interface->outHcOctets; // 64-bit output byte counter } // Formatted version: $interfaces = Format::IfXTables( $snmp->getIfXTable());
ARP table
$arp = $snmp->getArpTable(); foreach( $arp as $entry ) { echo $entry->interface; // Interface index echo $entry->ipAddress; // IP address echo $entry->mac; // Raw MAC address echo $entry->type; // Raw integer (1=other, 2=invalid, 3=dynamic, 4=static) } // Formatted version: $arp = Format::ArpTables( $snmp->getArpTable());
LLDP remote table
$lldp_rem = $snmp->getLldpRemTable(); foreach( $arp as $entry ) { echo $entry->localPort; // Local port index echo $entry->chassisIdType; // Chassis ID subtype echo $entry->chassisId; // Chassis identifier echo $entry->portIdType; // Port ID subtype echo $entry->portId; // Remote port identifier echo $entry->portDesc; // Remote port description echo $entry->sysName; // Remote system name echo $entry->sysDesc; // Remote system description echo $entry->capSupported; // Supported capabilities echo $entry->capEnabled; // Enabled capabilities } // Formatted values: $lldp_rem = Format::LldpRemTable( $snmp->getLldpRemTable());
IP address table
$addresses = $snmp->getIpAddrTable(); foreach( $addresses as $entry ) { echo $entry->address; // 10.0.0.1 echo $entry->interface; // Interface index — matches ifTable echo $entry->netmask; // 255.255.255.0 echo $entry->bcast; // Broadcast address bit echo $entry->reasmMaxSize; // Max datagram size for reassembly } // Fetch only specific columns $addresses = $snmp->getIpAddrTable( columns: ['address', 'interface', 'netmask'] );
IpAddrTable properties
| Property | Type | Description |
|---|---|---|
$address |
?string |
IP address |
$interface |
?int |
Interface index — matches IfTable index |
$netmask |
?string |
Subnet mask |
$bcast |
?int |
Broadcast address bit |
$reasmMaxSize |
?int |
Maximum datagram size for reassembly |
MAC address table
$macs = $snmp->getMacTable(); foreach( $macs as $entry ) { echo $entry->mac; // Raw MAC address echo $entry->bridge; // Bridge port number echo $entry->interface; // Interface index — matches ifTable index echo $entry->status; // Raw integer (3=learned, 4=self etc.) } // Formatted version $macs = Format::macTables( $snmp->getMacTable() );
MacTable properties
| Property | Type | Description |
|---|---|---|
$mac |
?string |
Raw MAC address. Use SnmpHelper::formatMacAddress() |
$bridge |
?int |
Bridge port number |
$interface |
?int |
Interface index — matches IfTable index. Null indicates the MAC is associated with the bridge interface itself rather than a physical port |
$status |
?int |
Entry status. Use SnmpHelper::formatMacStatus() |
IP forwarding table
$routes = $snmp->getIpForwardTable(); foreach( $routes as $route ) { echo $route->destination; // Destination network echo $route->mask; // Subnet mask echo $route->nextHop; // Next hop IP address echo $route->interface; // Interface index — matches ifTable echo $route->type; // Raw integer. Use SnmpHelper::formatIpForwardType() echo $route->protocol; // Raw integer. Use SnmpHelper::formatIpForwardProto() echo $route->status; // Raw integer. Use SnmpHelper::formatRowStatus() } // Fetch additional columns $routes = $snmp->getIpForwardTable( columns: [ 'interface', 'type', 'protocol', 'metric1', 'status', 'age', 'nextHopAs', 'metric2', 'metric3', 'metric4', 'metric5' ]); // Formatted version $routes = Format::ipForwardTables( $snmp->getIpForwardTable() );
IpForwardTable properties
| Property | Type | Description |
|---|---|---|
$destination |
?string |
Destination network address — always present |
$mask |
?string |
Destination subnet mask — always present |
$policy |
?int |
Route policy, typically 0 — always present |
$nextHop |
?string |
Next hop IP address — always present |
$interface |
?int |
Interface index — matches IfTable index |
$type |
?int |
Route type. Use SnmpHelper::formatIpForwardType() |
$protocol |
?int |
Routing protocol. Use SnmpHelper::formatIpForwardProto() |
$age |
?int |
Seconds since route was last updated |
$info |
?string |
Protocol specific info, rarely populated |
$nextHopAs |
?int |
Next hop autonomous system number |
$metric1 |
?int |
Primary routing metric |
$metric2 |
?int |
Secondary routing metric |
$metric3 |
?int |
Tertiary routing metric |
$metric4 |
?int |
Fourth routing metric |
$metric5 |
?int |
Fifth routing metric |
$status |
?int |
Row status. Use SnmpHelper::formatRowStatus() |
STP port table
$ports = $snmp->getStpPorts(); foreach( $ports as $port ) { echo $port->bridge; // Bridge port number — matches MacEntry bridge echo $port->priority; // Port priority (0-255) echo $port->state; // Raw integer. Use SnmpHelper::formatStpPortState() echo $port->enable; // Raw integer. Use SnmpHelper::formatStpPortEnable() echo $port->pathCost; // STP path cost echo $port->desRoot; // Designated root bridge ID (8 bytes binary) echo $port->desCost; // Designated path cost to root echo $port->desBridge; // Designated bridge ID (8 bytes binary) echo $port->desPort; // Designated port ID (2 bytes binary) } // Formatted version $ports = Format::stpPortEntries( $snmp->getStpPorts() );
StpPortEntry properties
| Property | Type | Description |
|---|---|---|
$bridge |
?int |
Bridge port number — matches $bridge in MacEntry |
$priority |
?int |
Port priority (0-255), default 128 |
$state |
?int |
STP port state. Use SnmpHelper::formatStpPortState() |
$enable |
?int |
Port enabled status. Use SnmpHelper::formatStpPortEnable() |
$pathCost |
?int |
STP path cost for this port |
$desRoot |
?string |
Designated root bridge ID (8 bytes). Use SnmpHelper::formatBridgeId() |
$desCost |
?int |
Designated path cost to root bridge |
$desBridge |
?string |
Designated bridge ID (8 bytes). Use SnmpHelper::formatBridgeId() |
$desPort |
?string |
Designated port ID (2 bytes). Use SnmpHelper::formatStpPortId() |
Formatting helpers
Raw integer values can be converted to human-readable labels using SnmpHelper:
use Ocolin\EasySNMP\SnmpHelper; // Interface status SnmpHelper::formatOperStatus( $interface->operStatus ); // "up", "down", "testing", "unknown", "dormant", "notPresent", "lowerLayerDown" SnmpHelper::formatAdminStatus( $interface->adminStatus ); // "up", "down", "testing" // Interface type SnmpHelper::formatIfType( $interface->type ); // "ethernet", "softwareLoopback", "tunnel", "ieee8023adLag", etc. // MAC address formatting SnmpHelper::formatMacAddress( $interface->macAddress ); // "00:11:22:33:44:55" SnmpHelper::formatMacAddress( $entry->mac ); // "00:11:22:33:44:55" // ARP entry type SnmpHelper::formatArpType( $entry->type ); // "other", "invalid", "dynamic", "static"
All helper methods accept null and return null, so they are safe to call
directly on nullable DTO properties.
Extending for vendor-specific devices
EasySNMP is designed to be extended. Vendor-specific functionality can be
added by extending the base class and adding traits for proprietary OID trees:
namespace Ocolin\Hyconext; use Ocolin\EasySNMP\EasySNMP; use Ocolin\Hyconext\Traits\PoeTrait; class HyconextSNMP extends EasySNMP { use PoeTrait; }
The extending class inherits all standard MIB-II methods and gains access to
bulkWalk(), getColumn(), and getCompositeColumn() for building
vendor-specific trait methods.
PHP 8.4 compatibility
FreeDSx SNMP was written for PHP 7.4 and contains a nullable type deprecation
that triggers on PHP 8.4. This is handled internally within EasySNMP and does
not affect consuming code. A fix has been submitted upstream via pull request.
Property Lists
IfTable properties
| Property | Type | Description |
|---|---|---|
$index |
int |
Interface index |
$description |
?string |
Interface description string |
$type |
?int |
IANA interface type. Use SnmpHelper::formatIfType() |
$mtu |
?int |
Maximum transmission unit in bytes |
$speed |
?int |
Interface speed in bits per second |
$macAddress |
?string |
Raw MAC address. Use SnmpHelper::formatMacAddress() |
$adminStatus |
?int |
Administrative status. Use SnmpHelper::formatAdminStatus() |
$operStatus |
?int |
Operational status. Use SnmpHelper::formatOperStatus() |
$lastChange |
?int |
Time of last status change in TimeTicks |
$inOctets |
?int |
32-bit input byte counter |
$outOctets |
?int |
32-bit output byte counter |
$inErrors |
?int |
Input error counter |
$outErrors |
?int |
Output error counter |
IfXTable properties
| Property | Type | Description |
|---|---|---|
$index |
int |
Interface index — matches IfTable index |
$name |
?string |
Interface name |
$inMcast |
?int |
32-bit multicast inbound packets |
$outMcast |
?int |
32-bit multicast outbound packets |
$inBcast |
?int |
32-bit broadcast inbound packets |
$outBcast |
?int |
32-bit broadcast outbound packets |
$inHcOctets |
?int |
64-bit input byte counter, use instead of inOctets on fast interfaces |
$inHcUcast |
?int |
64-bit unicast inbound packets |
$inHcMcast |
?int |
64-bit multicast inbound packets |
$inHcBcast |
?int |
64-bit broadcast inbound packets |
$outHcOctets |
?int |
64-bit output byte counter, use instead of outOctets on fast interfaces |
$outHcUcast |
?int |
64-bit unicast outbound packets |
$outHcMcast |
?int |
64-bit multicast outbound packets |
$outHcBcast |
?int |
64-bit broadcast outbound packets |
$highSpeed |
?int |
Speed in Mbps, use instead of speed on fast interfaces |
$alias |
?string |
Administrator-set interface alias |
System properties
| Property | Type | Description |
|---|---|---|
$descr |
?string |
Full description of the device |
$upTime |
?int |
System uptime in TimeTicks |
$contact |
?string |
Contact information |
$name |
?string |
Device name |
$location |
?string |
Physical location |
$objectId |
?string |
Vendor enterprise OID |
ArpTable properties
| Property | Type | Description |
|---|---|---|
$interface |
?int |
Interface index — matches IfTable index |
$mac |
?string |
Raw MAC address. Use SnmpHelper::formatMacAddress() |
$ipAddress |
?string |
IP address of ARP entry |
$type |
?int |
Entry type. Use SnmpHelper::formatArpType() |
Direct SNMP access
For custom queries beyond the built-in methods, pass-through access to the underlying FreeDSx client is available:
// Fetch specific OIDs $result = $snmp->get( '1.3.6.1.2.1.1.1.0', '1.3.6.1.2.1.1.5.0' ); // Fetch next OID $result = $snmp->getNext( '1.3.6.1.2.1.1.1.0' ); // Walk an OID subtree $walk = $snmp->walk( startAt: '1.3.6.1.2.1.1' ); // Bulk walk an OID subtree — returns paginated Oid[] array $oids = $snmp->bulkWalk( oid: '1.3.6.1.2.1.2.2.1' );
These methods return raw FreeDSx objects. See the FreeDSx documentation for details on working with the returned values.
License
MIT
ocolin/easysnmp 适用场景与选型建议
ocolin/easysnmp 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 37 次下载、GitHub Stars 达 1, 最近一次更新时间为 2025 年 04 月 30 日, 在 PHP 生态内属于活跃度较高的组件。
它主要适用于以下技术方向: 「network」 「php」 「monitoring」 「interfaces」 「snmp」 「mib」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。
我们在过去多个企业项目中使用过 ocolin/easysnmp 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 ocolin/easysnmp 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
与 ocolin/easysnmp 相关的其它包
同方向 / 同关键字的高下载量 PHP Composer 包推荐,方便对比选型:
A Symfony bundle for chameleon-system/sanitycheck
LinkedIn API PHP SDK with OAuth 2.0 & CSRF support. Can be used for social sign in or sharing on LinkedIn. Examples. Documentation.
SoftWax Health Check Bundle for Symfony framework
1Pilot client for Symfony
LinkedIn API PHP SDK with OAuth 2.0 & CSRF support. Can be used for social sign in or sharing on LinkedIn. Examples. Documentation.
PHP SDK for Bands In Town API
统计信息
- 总下载量: 37
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 1
- 点击次数: 22
- 依赖项目数: 3
- 推荐数: 0
其他信息
- 授权协议: MIT
- 更新时间: 2025-04-30