PHP-Pakete über mehrere Versionen hinweg synchronisieren
Wer mehrere PHP-Versionen parallel auf einem Server betreibt – sei es für Entwicklungsumgebungen oder zum Hosten unterschiedlicher Projekte (z. B. 5.6, 7.4, 8.0, 8.2 …) – kennt das Problem: Die Erweiterungen sind oft nicht einheitlich installiert. In einer Version fehlt php-intl
, in einer anderen ist php-curl
nicht vorhanden.
#!/bin/bash
set -e
# nur echte Versionsordner (z. B. 7.4, 8.0, 8.1) berücksichtigen
versions=($(ls /etc/php/ | grep -E '^[0-9]+\.[0-9]+$' | sort -u))
# installierte Pakete je Version erfassen (Versionsnummer im Namen entfernen)
declare -A pkgs
all_pkgs=()
for v in "${versions[@]}"; do
pkgs[$v]=$(dpkg -l | awk -v ver="$v" '
/^ii/ && $2 ~ ("^php"ver"-") {
sub("^php"ver, "php", $2); # php7.4-xml → php-xml
print $2
}')
all_pkgs+=(${pkgs[$v]})
done
# Vergleich und Nachinstallation
for v in "${versions[@]}"; do
echo "> Prüfe PHP $v"
for refver in "${versions[@]}"; do
[ "$refver" = "$v" ] && continue
for pkg in ${pkgs[$refver]}; do
# ursprünglichen Paketnamen rekonstruieren (mit Version)
target="php$v${pkg#php}"
# prüfen ob Paket existiert und kein virtuelles Paket ist
if apt-cache show "$target" 2>/dev/null | grep -q '^Filename:'; then
if ! dpkg -l | grep -q "^ii $target "; then
echo ">> Installiere fehlendes Paket $target (aus Vorlage $refver)"
DEBIAN_FRONTEND=noninteractive apt-get install -y "$target"
fi
else
echo ">> Überspringe $target (virtuell oder nicht verfügbar für $v)"
fi
done
done
done
# Alle Pakete nach Sync erneut einsammeln
all_pkgs=()
for v in "${versions[@]}"; do
pkgs[$v]=$(dpkg -l | awk -v ver="$v" '
/^ii/ && $2 ~ ("^php"ver"-") {
sub("^php"ver, "php", $2)
print $2
}')
all_pkgs+=(${pkgs[$v]})
done
all_pkgs=($(printf "%s\n" "${all_pkgs[@]}" | sort -u))
# Tabellarische Übersicht
echo
echo "=============================="
echo " Übersicht der PHP-Pakete"
echo "=============================="
printf "%-35s" "Paket"
for v in "${versions[@]}"; do
printf "%10s" "$v"
done
printf "\n"
for pkg in "${all_pkgs[@]}"; do
printf "%-35s" "$pkg"
for v in "${versions[@]}"; do
# prüfen ob dieses Paket in dieser Version installiert ist
if dpkg -l | awk -v ver="$v" -v p="$pkg" '
/^ii/ && $2 ~ ("^php"ver"-") {
sub("^php"ver, "php", $2)
if ($2 == p) found=1
}
END {exit !found}' ; then
printf "%10s" "✔"
else
printf "%10s" "-"
fi
done
printf "\n"
done
echo "Fertig."
Nutzung
Speichere das Skript z. B. als install-php-packages.sh
und mache es ausführbar:
chmod +x install-php-packages.sh
Danach kannst du es starten:
./install-php-packages.sh
Es prüft alle auf dem System vorhandenen PHP-Versionen, installiert fehlende Erweiterungen und zeigt anschließend eine tabellarische Übersicht.