Signatur
Beschreibung
RRDUpdater ist Teil der PECL-Erweiterung rrd und stellt eine objektorientierte Schnittstelle bereit, um Messwerte in eine bereits vorhandene RRD-Datei (Round-Robin-Database) einzutragen. RRD-Datenbanken werden typischerweise für Zeitreihen-Daten wie Netzwerk-Durchsatz, CPU-Last oder Temperatursensoren verwendet.
Das Objekt wird mit dem Pfad zur RRD-Datei instanziiert. Anschließend werden die zu schreibenden Werte über RRDUpdater::setValues() gesetzt und mit RRDUpdater::update() in die Datenbank geschrieben. Intern ruft die Klasse das gleichnamige rrd_update-Kommando auf.
Typischer Einsatz ist ein Monitoring-Skript, das in regelmäßigen Intervallen (z. B. per Cron) aktuelle Messwerte erfasst und persistiert, um sie später mit RRDGraph zu visualisieren oder mit RRDFetch auszulesen.
Voraussetzung ist, dass die RRD-Datei zuvor mit RRDCreator angelegt wurde und die Data-Source-Namen sowie Datentypen korrekt übereinstimmen.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $path Pflicht | string | Dateisystempfad zur bestehenden .rrd-Datei, die aktualisiert werden soll. |
Beispiele
Netzwerk-Traffic in eine RRD-Datei schreiben
<?php
// Voraussetzung: Die Datei traffic.rrd wurde bereits mit RRDCreator angelegt
// und besitzt die Data Sources 'inbytes' und 'outbytes'.
$updater = new RRDUpdater('/var/rrd/traffic.rrd');
// Aktuelle Messwerte (z.B. aus SNMP oder /proc/net/dev)
$inbytes = 1048576; // 1 MiB empfangen
$outbytes = 524288; // 0,5 MiB gesendet
$updater->setValues(
['inbytes' => $inbytes, 'outbytes' => $outbytes],
time()
);
if ($updater->update()) {
echo "RRD erfolgreich aktualisiert.\n";
} else {
echo "Fehler beim Aktualisieren der RRD-Datenbank.\n";
}
Temperatursensor-Werte zyklisch speichern
<?php
// Dieses Skript wird z.B. per Cron jede Minute ausgeführt.
// Die RRD-Datei hat eine Data Source 'temp' vom Typ GAUGE.
function readTemperature(): float {
// Simulierter Sensorwert (z.B. aus /sys/class/thermal/...)
return round(rand(200, 800) / 10, 1);
}
$rrdFile = '/var/rrd/temperature.rrd';
if (!file_exists($rrdFile)) {
// Erst anlegen, wenn noch nicht vorhanden
$creator = new RRDCreator($rrdFile, 'now', 86400);
$creator->addDataSource('temp:GAUGE:120:U:U');
$creator->addArchive('AVERAGE:0.5:1:1440');
$creator->create();
}
$updater = new RRDUpdater($rrdFile);
$updater->setValues(['temp' => readTemperature()], time());
if (!$updater->update()) {
error_log('RRD-Update fehlgeschlagen für ' . $rrdFile);
}
// Wichtig · Fallstricke
Zeitstempel-Konsistenz: RRD erlaubt keine Einträge mit einem Zeitstempel, der älter ist als der zuletzt gespeicherte. Wird time() für den Zeitstempel verwendet, muss das Skript häufig genug ausgeführt werden, damit keine Lücken entstehen, die größer als das konfigurierte Heartbeat-Intervall der Data Sources sind.
PECL-Erweiterung: RRDUpdater ist Bestandteil der PECL-Erweiterung rrd (pecl install rrd) und steht in einer Standard-PHP-Installation nicht zur Verfügung. Auf dem System muss außerdem die Bibliothek librrd installiert sein.
Fehlerbehandlung: update() gibt false zurück, wenn der Schreibvorgang fehlschlägt (z. B. falscher Data-Source-Name, Datei nicht vorhanden, ungültiger Zeitstempel). Aussagekräftige Fehlermeldungen liefert in diesem Fall rrd_error().