Signatur
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
-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';
}
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;
}
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.';
}
// 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.