SNMP (Simple Network Management Protocol) は、ネットワーク デバイスの管理と監視に使用されるプロトコルです。最新のソフトウェア システムでは、SNMP はネットワーク デバイスのステータス監視、パフォーマンス統計、トラブルシューティングなどのシナリオで広く使用されています。 PHP 開発では、Swoole は高性能の非同期ネットワーク フレームワークとして、SNMP 非同期操作のサポートも提供します。
この記事では、SNMP の基本知識、Swoole での非同期 SNMP クライアントの使用方法、いくつかの実践的なアプリケーション シナリオなど、Swoole を使用して非同期 SNMP 操作を実装する方法を紹介します。
SNMP の基本
SNMP プロトコルは、いくつかのコマンドといくつかのオブジェクトで構成されています。コマンドは主にGET、SET、GET-NEXT、TRAPなどに分かれており、オブジェクトはネットワークデバイス内の何らかのデータやステータス情報です。このうち、GET コマンドは 1 つ以上のオブジェクトの値を取得するために使用され、SET コマンドはオブジェクトの値を設定するために使用され、GET-NEXT コマンドはオブジェクト ツリー内の次のオブジェクトを走査するために使用され、TRAP コマンドはコマンドはデバイスの管理に使用され、システムはアラームまたは通知を送信します。
SNMP クライアントの主な仕事は、SNMP エージェントにコマンドを送信し、エージェントから返された結果を受信することです。従来の同期ネットワーク通信では、SNMP クライアントは通常、クラス ライブラリまたは API を介して SNMP エージェントにコマンドを送信し、エージェントが結果を返すのを待ってから次のステップに進みます。この同期方法にはいくつかの欠点があり、たとえば、待機をブロックするとプログラムのパフォーマンスが低下し、同時実行性の高いアプリケーションのシナリオには適していません。
Swoole 非同期 SNMP クライアント
Swoole は、非同期ネットワーク フレームワークとして、SNMP 非同期操作のサポートを提供します。 Swoole では、swoole_snmp クラスを通じて SNMP クライアントを作成し、コマンドを送信し、結果を非同期に受信できます。 swoole_snmp クラスは次のメソッドを定義します:
構築メソッド、 SNMPクライアントを作成します。このうち、$hostはSNMPエージェントのIPアドレスまたはホスト名、$communityはSNMPコミュニティ名、$timeoutはタイムアウト(単位:秒)、デフォルトは1秒、$retriesはリトライ回数、デフォルトは 5 回です。
オブジェクトの値を設定します。$oid はオブジェクトを表します。 ID ; $value はオブジェクトの値を表し、$type は値のタイプを表します。
GET コマンドを送信して、1 つ以上のオブジェクトの値を取得します。このうち、$oids は 1 つ以上のオブジェクト ID (配列またはカンマ区切りの文字列) を表し、$callback は結果の取得時に呼び出されるコールバック関数を表します。
get メソッドと同様の非同期 GET コマンドを送信します。ただし、結果を取得する方法は次のとおりです。非同期。
GET-NEXT コマンドを送信します。オブジェクト ツリー内の複数のオブジェクトをスキャンします。このうち、$oid は開始オブジェクト ID を表し、$callback は結果が取得されるときに呼び出されるコールバック関数を表します。$max_oids は毎回取得されるオブジェクトの最大数を表し、デフォルトは 10 です。$non_repeaters は非取得を表します。 Get-Next -repeaters パラメーター、デフォルトは 0、$max_repetitions は Get-Next の max-repetitions パラメーターを表し、デフォルトは 10 です。
非同期 GET-NEXT コマンドを送信するwalk メソッドと似ていますが、結果を取得する方法が非同期である点が異なります。
タイムアウト(単位:秒)を設定します。
再試行回数を設定します。
サンプル アプリケーション
以下では、簡単な例を使用して、Swoole 非同期 SNMP クライアントの使用方法を示します。 SNMP エージェントから CPU とメモリの使用量を取得し、結果をログ ファイルに書き込む必要があるとします。
{ "require": { "swoole/swoole": "~2.1.3", "swoole/snmp": "~1.2" } }
<?php require_once __DIR__ . '/vendor/autoload.php'; use SwooleCoroutine as co; use SwooleCoroutineSystem; use SwooleCoroutineClient; use SwooleCoroutineScheduler; co::set(['hook_flags' => SWOOLE_HOOK_ALL]); $logFile = __DIR__ . '/snmp.log'; $scheduler = new Scheduler(); $scheduler->add(function () use ($logFile) { $snmp = new swoole_snmp('127.0.0.1', 'public'); $cpuOid = '1.3.6.1.2.1.25.3.3.1.2.196608'; $memOid = '1.3.6.1.4.1.2021.4.6.0'; $snmp->getAsync([$cpuOid, $memOid], function ($result) use ($logFile) { if (is_array($result) && count($result) == 2) { $cpuUsage = $result[$cpuOid]; $memUsage = round($result[$memOid] / 1024, 2); // KB to MB $logMsg = date('Y-m-d H:i:s') . " CPU usage: {$cpuUsage}%, Memory usage: {$memUsage}MB" . PHP_EOL; System::writeFile($logFile, $logMsg, FILE_APPEND); } else { echo "Failed to get CPU and memory usage." . PHP_EOL; } }); }); $scheduler->start();
上の例では、Swoole コルーチン スケジューラーを作成し、コルーチン タスクをスケジューラーに追加しました。このタスクでは、SNMP クライアントを作成し、getAsync メソッドを使用して CPU とメモリの使用量を非同期的に取得し、結果をログ ファイルに書き込みました。結果が非同期で取得される場合、コールバック関数が呼び出されて処理されます。
上記のスクリプトでは Swoole のコルーチン API を使用しているため、コルーチンのサポートを有効にする必要があることに注意してください。 co::set メソッドを呼び出して、hook_flags パラメータを SWOOLE_HOOK_ALL に設定します。これは、PHP 関数のコルーチン サポートが有効であることを意味します。
$ php snmp.php $ tail -f snmp.log # 或者用其他文本编辑器打开
サマリー
この記事では、Swoole を使用して非同期 SNMP 操作を実装する方法を紹介し、サンプル アプリケーションを提供します。従来の同期ネットワーク通信方法と比較して、Swoole 非同期 SNMP クライアントを使用すると、プログラムのパフォーマンスと応答速度が大幅に向上し、同時実行性の高いネットワーク アプリケーション シナリオにより適しています。実際のアプリケーションでは、ビジネス シナリオのニーズに応じてさまざまな SNMP コマンドとパラメータを選択し、ネットワーク デバイスのステータスの監視と管理のニーズを満たすことができます。
以上がSwoole が非同期 SNMP 操作をサポートする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。