Maison  >  Article  >  cadre php  >  Comment Swoole prend en charge les opérations SNMP asynchrones

Comment Swoole prend en charge les opérations SNMP asynchrones

王林
王林original
2023-06-25 10:06:23721parcourir

SNMP (Simple Network Management Protocol) est un protocole utilisé pour gérer et surveiller les périphériques réseau. Dans les systèmes logiciels modernes, SNMP est largement utilisé dans des scénarios tels que la surveillance de l'état des périphériques réseau, les statistiques de performances et le dépannage. Dans le développement PHP, Swoole, en tant que framework de réseau asynchrone hautes performances, prend également en charge les opérations asynchrones SNMP.

Cet article présentera comment utiliser Swoole pour implémenter des opérations SNMP asynchrones, y compris des connaissances de base de SNMP, comment utiliser le client SNMP asynchrone dans Swoole et quelques scénarios d'application pratiques.

Bases de SNMP

Le protocole SNMP est composé de plusieurs commandes et de plusieurs objets. Les commandes sont principalement divisées en GET, SET, GET-NEXT et TRAP, etc., et les objets sont des données ou des informations d'état dans le périphérique réseau. Parmi eux, la commande GET est utilisée pour obtenir la valeur d'un ou plusieurs objets ; la commande SET est utilisée pour définir la valeur d'un objet ; la commande GET-NEXT est utilisée pour parcourir l'objet suivant dans l'arborescence des objets ; La commande est utilisée pour gérer l’appareil. Le système envoie une alarme ou une notification.

Pour un client SNMP, sa tâche principale est d'envoyer des commandes à l'agent SNMP et de recevoir les résultats renvoyés par l'agent. Dans la communication réseau synchrone traditionnelle, le client SNMP envoie généralement des commandes à l'agent SNMP via certaines bibliothèques de classes ou API, et attend que l'agent renvoie les résultats avant de passer à l'étape suivante. Cette méthode de synchronisation présente certains inconvénients. Par exemple, le blocage et l'attente réduiront les performances du programme et ne conviennent pas aux scénarios d'application à forte concurrence.

Client SNMP asynchrone Swoole

Swoole, en tant que framework de réseau asynchrone, prend en charge les opérations asynchrones SNMP. Dans Swoole, nous pouvons créer un client SNMP via la classe swoole_snmp, envoyer des commandes et recevoir des résultats de manière asynchrone. La classe swoole_snmp définit les méthodes suivantes :

  1. swoole_snmp::__construct($host, $community, $timeout = 1, $retries = 5)

Méthode de construction pour créer un client SNMP. Parmi eux, $host représente l'adresse IP ou le nom d'hôte de l'agent SNMP ; $community représente le nom de la communauté SNMP ; $timeout représente le délai d'attente (unité : secondes), la valeur par défaut est 1 seconde ; la valeur par défaut est 5 fois.

  1. swoole_snmp::set($oid, $value, $type = SNMP::TYPE_NULL)

Définissez la valeur d'un objet, où $oid représente l'ID de l'objet ; $value représente la valeur de l'objet ; type représente le type de valeur.

  1. swoole_snmp::get($oids, $callback)

Envoyez une commande GET pour obtenir la valeur d'un ou plusieurs objets. Parmi eux, $oids représente un ou plusieurs ID d'objet, qui peuvent être un tableau ou une chaîne séparée par des virgules ; $callback représente une fonction de rappel, qui sera appelée lorsque le résultat sera obtenu.

  1. swoole_snmp::getAsync($oids, $callback)

Envoie une commande GET asynchrone, similaire à la méthode get, sauf que la manière d'obtenir les résultats est asynchrone.

  1. swoole_snmp::walk($oid, $callback, $max_oids = 10, $non_repeaters = 0, $max_repetitions = 10)

Envoie une commande GET-NEXT pour parcourir plusieurs objets dans l'arborescence des objets. Parmi eux, $oid représente l'ID de l'objet de départ ; $callback représente la fonction de rappel, qui sera appelée lorsque le résultat est obtenu ; $max_oids représente le nombre maximum d'objets obtenus à chaque fois, la valeur par défaut est 10 ; $non_repeaters représente non in ; Paramètre Get-Next -repeaters, la valeur par défaut est 0 ; $max_repetitions représente le paramètre max-repetitions dans Get-Next, la valeur par défaut est 10.

  1. swoole_snmp::walkAsync($oid, $callback, $max_oids = 10, $non_repeaters = 0, $max_repetitions = 10)

Envoie une commande asynchrone GET-NEXT, similaire à la méthode walk, juste comme ça obtenir les résultats est asynchrone.

  1. swoole_snmp::setTimeout($timeout)

Définissez le délai d'attente (unité : secondes).

  1. swoole_snmp::setRetries($retries)

Définissez le nombre de tentatives.

Exemple d'application

Ci-dessous, nous utilisons un exemple simple pour montrer comment utiliser le client SNMP asynchrone Swoole. Supposons que nous devions récupérer une partie de l'utilisation du processeur et de la mémoire d'un agent SNMP et écrire les résultats dans un fichier journal.

  1. Tout d'abord, ajoutez la dépendance swoole/snmp dans le fichier composer.json :
{
    "require": {
        "swoole/swoole": "~2.1.3",
        "swoole/snmp": "~1.2"
    }
}
  1. Écrivez un script pour obtenir l'utilisation du processeur et de la mémoire de manière asynchrone :
<?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();

Dans l'exemple ci-dessus, nous avons créé un planificateur de coroutine Swoole. et ajouté une tâche coroutine dans le planificateur. Dans cette tâche, nous avons créé un client SNMP, utilisé la méthode getAsync pour obtenir de manière asynchrone l'utilisation du processeur et de la mémoire, et écrit les résultats dans le fichier journal. Lorsque les résultats sont obtenus de manière asynchrone, la fonction de rappel sera appelée pour traitement.

Il convient de noter que dans le script ci-dessus, nous utilisons l'API coroutine de Swoole, nous devons donc activer la prise en charge de la coroutine. Nous définissons le paramètre hook_flags sur SWOOLE_HOOK_ALL en appelant la méthode co::set, ce qui signifie que la prise en charge des coroutines pour les fonctions PHP est activée.

  1. Exécutez le script et affichez les résultats du fichier journal :
$ php snmp.php
$ tail -f snmp.log # 或者用其他文本编辑器打开

Résumé

Cet article explique comment utiliser Swoole pour implémenter des opérations SNMP asynchrones et fournit un exemple d'application. Par rapport à la méthode de communication réseau synchrone traditionnelle, l'utilisation du client SNMP asynchrone Swoole peut considérablement améliorer les performances et la vitesse de réponse du programme, et est également plus adaptée aux scénarios d'application réseau à haute concurrence. Dans les applications pratiques, nous pouvons choisir différentes commandes et paramètres SNMP en fonction des besoins des scénarios commerciaux pour répondre à nos besoins de surveillance et de gestion de l'état des périphériques réseau.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn