Start · Sprachen · PHP · Referenz · rpmvercmp

rpmvercmp

Funktion

Vergleicht zwei RPM-Versions-Zeichenketten nach dem RPM-Versionierungsalgorithmus und gibt das Vergleichsergebnis zurück.

seit PHP 8.0.0 Kategorie: misc

Signatur

rpmvercmp(string $evr1, string $evr2): int

Beschreibung

rpmvercmp() vergleicht zwei Versions-Zeichenketten im RPM-Format (Epoch:Version-Release, kurz EVR) miteinander und gibt einen ganzzahligen Wert zurück, der angibt, ob die erste Zeichenkette kleiner, gleich oder größer als die zweite ist. Der verwendete Algorithmus entspricht dem internen RPM-Versionsvergleich und ist damit kompatibel mit dem Verhalten von rpm-Werkzeugen auf Linux-Systemen.

Das RPM-Versionsformat kann aus mehreren Bestandteilen bestehen: Epoch (optionale Ganzzahl, getrennt durch :), Version (z. B. 1.2.3) und Release (getrennt durch -). Der Algorithmus behandelt numerische und alphanumerische Teilzeichenketten separat, sodass etwa 10 größer als 9 ist und nicht wie bei einer einfachen Zeichenkettenvergleich behandelt wird.

Die Funktion ist besonders nützlich, wenn PHP-Anwendungen Paketversionen aus RPM-basierten Systemen (z. B. RHEL, CentOS, Fedora) verwalten, sortieren oder vergleichen müssen, ohne externe Systemaufrufe zu benötigen. Sie steht als Teil der PECL-Erweiterung rpminfo zur Verfügung.

Die Funktion ist rein auf den Zeichenkettenvergleich nach RPM-Regeln beschränkt – sie prüft nicht, ob die übergebenen Versionen tatsächlich installierte Pakete repräsentieren.

Parameter

Name Typ Default Beschreibung
$evr1 Pflicht string Die erste RPM-Versions-Zeichenkette im Format [Epoch:]Version[-Release], die verglichen werden soll.
$evr2 Pflicht string Die zweite RPM-Versions-Zeichenkette im Format [Epoch:]Version[-Release], die verglichen werden soll.

Rückgabewert

Typ
int
Beschreibung
Gibt -1 zurück, wenn evr1 kleiner als evr2 ist, 0 wenn beide gleich sind, und 1 wenn evr1 größer als evr2 ist.

Beispiele

Einfacher Versionsvergleich

<?php
$result = rpmvercmp('1.10.0', '1.9.0');
if ($result > 0) {
    echo '1.10.0 ist neuer als 1.9.0';
} elseif ($result < 0) {
    echo '1.10.0 ist älter als 1.9.0';
} else {
    echo 'Versionen sind gleich';
}
1.10.0 ist neuer als 1.9.0

Versionen mit Epoch und Release sortieren

<?php
$versions = [
    '1:2.3.4-1.el8',
    '2.3.4-2.el8',
    '1:2.3.3-5.el8',
    '2.4.0-1.el8',
];

usort($versions, 'rpmvercmp');

foreach ($versions as $v) {
    echo $v . PHP_EOL;
}
2.3.4-2.el8 2.4.0-1.el8 1:2.3.3-5.el8 1:2.3.4-1.el8

Gleichheit zweier Versionen prüfen

<?php
$a = '2.0.1-3.el9';
$b = '2.0.1-3.el9';

if (rpmvercmp($a, $b) === 0) {
    echo 'Die Versionen sind identisch.';
} else {
    echo 'Die Versionen unterscheiden sich.';
}
Die Versionen sind identisch.

// Wichtig · Fallstricke

Voraussetzung: Die Funktion rpmvercmp() ist Teil der PECL-Erweiterung rpminfo, die separat installiert werden muss (pecl install rpminfo). Sie ist nicht im PHP-Kern enthalten und steht daher nicht auf allen Systemen zur Verfügung.

Beachte, dass eine Epoch-Angabe den Versionsvergleich dominiert: Eine Version mit Epoch 1: ist immer größer als eine Version ohne Epoch (was als Epoch 0 gewertet wird), unabhängig von Version und Release.

Der Algorithmus entspricht nicht version_compare() aus dem PHP-Kern – beide Funktionen liefern bei identischen Eingaben möglicherweise unterschiedliche Ergebnisse, da version_compare() keine RPM-Spezifika wie Epoch kennt.