Skip to content

Commit 27bd553

Browse files
committed
Improve PHP setup: enforce version pinning and cleanup
Enhances the PHP setup function to enforce APT pinning for PHP versions during updates and installations, ensuring correct version selection. Adds logic to remove conflicting PHP versions, improves module availability checks, and provides clearer messaging for installed and missing modules.
1 parent 8ad68e7 commit 27bd553

File tree

1 file changed

+49
-20
lines changed

1 file changed

+49
-20
lines changed

misc/tools.func

Lines changed: 49 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -3632,6 +3632,18 @@ function setup_php() {
36323632
if [[ -n "$CURRENT_PHP" && "$CURRENT_PHP" == "$PHP_VERSION" ]]; then
36333633
msg_info "Update PHP $PHP_VERSION"
36343634

3635+
# Ensure pinning exists even for updates (prevent unwanted version changes)
3636+
mkdir -p /etc/apt/preferences.d
3637+
cat <<EOF >/etc/apt/preferences.d/php-pin
3638+
Package: php${PHP_VERSION}*
3639+
Pin: version ${PHP_VERSION}.*
3640+
Pin-Priority: 1001
3641+
3642+
Package: php[0-9].*
3643+
Pin: release o=packages.sury.org-php
3644+
Pin-Priority: -1
3645+
EOF
3646+
36353647
# Ensure Sury repo is available
36363648
if [[ ! -f /etc/apt/sources.list.d/php.sources ]]; then
36373649
manage_tool_repository "php" "$PHP_VERSION" "" "https://packages.sury.org/debsuryorg-archive-keyring.deb" || {
@@ -3641,6 +3653,7 @@ function setup_php() {
36413653
fi
36423654

36433655
ensure_apt_working || return 1
3656+
$STD apt-get update
36443657

36453658
# Perform upgrade with retry logic (non-fatal if fails)
36463659
upgrade_packages_with_retry "php${PHP_VERSION}" || true
@@ -3653,36 +3666,42 @@ function setup_php() {
36533666
msg_info "Upgrade PHP from $CURRENT_PHP to $PHP_VERSION"
36543667
# Stop and disable ALL PHP-FPM versions
36553668
stop_all_services "php.*-fpm"
3656-
remove_old_tool_version "php"
36573669
else
36583670
msg_info "Setup PHP $PHP_VERSION"
36593671
fi
36603672

3673+
# Create APT pinning BEFORE any repo changes to ensure correct version is selected
3674+
mkdir -p /etc/apt/preferences.d
3675+
cat <<EOF >/etc/apt/preferences.d/php-pin
3676+
Package: php${PHP_VERSION}*
3677+
Pin: version ${PHP_VERSION}.*
3678+
Pin-Priority: 1001
3679+
3680+
Package: php[0-9].*
3681+
Pin: release o=packages.sury.org-php
3682+
Pin-Priority: -1
3683+
EOF
3684+
36613685
# Prepare repository (cleanup + validation)
36623686
prepare_repository_setup "php" "deb.sury.org-php" || {
36633687
msg_error "Failed to prepare PHP repository"
36643688
return 1
36653689
}
36663690

3691+
# Remove ALL conflicting PHP versions (critical for version enforcement)
3692+
if [[ -n "$CURRENT_PHP" && "$CURRENT_PHP" != "$PHP_VERSION" ]]; then
3693+
msg_info "Removing PHP ${CURRENT_PHP}"
3694+
$STD apt-get purge -y "php${CURRENT_PHP}*" "libapache2-mod-php${CURRENT_PHP}*" 2>/dev/null || true
3695+
$STD apt-get autoremove -y 2>/dev/null || true
3696+
fi
3697+
36673698
# Setup Sury repository
36683699
manage_tool_repository "php" "$PHP_VERSION" "" "https://packages.sury.org/debsuryorg-archive-keyring.deb" || {
36693700
msg_error "Failed to setup PHP repository"
36703701
return 1
36713702
}
36723703

36733704
ensure_apt_working || return 1
3674-
3675-
# Force version preference during installation
3676-
mkdir -p /etc/apt/preferences.d
3677-
cat <<EOF >/etc/apt/preferences.d/php-pin
3678-
Package: php${PHP_VERSION}*
3679-
Pin: version ${PHP_VERSION}.*
3680-
Pin-Priority: 1001
3681-
3682-
Package: php8.*
3683-
Pin: release o=packages.sury.org-php
3684-
Pin-Priority: -1
3685-
EOF
36863705
$STD apt-get update
36873706
fi
36883707

@@ -3698,26 +3717,36 @@ EOF
36983717
# Build module list with version constraints
36993718
local MODULE_LIST="php${PHP_VERSION}=${AVAILABLE_PHP_VERSION}-*"
37003719
local FAILED_MODULES=()
3720+
local INSTALLED_MODULES=()
37013721

37023722
IFS=',' read -ra MODULES <<<"$COMBINED_MODULES"
37033723
for mod in "${MODULES[@]}"; do
3704-
if apt-cache show "php${PHP_VERSION}-${mod}" 2>/dev/null | grep -q "^Package:"; then
3705-
MODULE_LIST+=" php${PHP_VERSION}-${mod}=${AVAILABLE_PHP_VERSION}-*"
3724+
local pkg_name="php${PHP_VERSION}-${mod}"
3725+
if apt-cache search "^${pkg_name}\$" 2>/dev/null | grep -q "^${pkg_name}"; then
3726+
MODULE_LIST+=" ${pkg_name}=${AVAILABLE_PHP_VERSION}-*"
3727+
INSTALLED_MODULES+=("${pkg_name}")
37063728
else
3707-
FAILED_MODULES+=("php${PHP_VERSION}-${mod}")
3729+
FAILED_MODULES+=("${pkg_name}")
37083730
fi
37093731
done
37103732

37113733
if [[ "$PHP_FPM" == "YES" ]]; then
3712-
if apt-cache show "php${PHP_VERSION}-fpm" 2>/dev/null | grep -q "^Package:"; then
3713-
MODULE_LIST+=" php${PHP_VERSION}-fpm=${AVAILABLE_PHP_VERSION}-*"
3734+
local fpm_pkg="php${PHP_VERSION}-fpm"
3735+
if apt-cache search "^${fpm_pkg}\$" 2>/dev/null | grep -q "^${fpm_pkg}"; then
3736+
MODULE_LIST+=" ${fpm_pkg}=${AVAILABLE_PHP_VERSION}-*"
3737+
INSTALLED_MODULES+=("${fpm_pkg}")
37143738
else
3715-
FAILED_MODULES+=("php${PHP_VERSION}-fpm")
3739+
FAILED_MODULES+=("${fpm_pkg}")
37163740
fi
37173741
fi
37183742

3743+
# Only warn if there are genuinely missing modules
37193744
if [[ ${#FAILED_MODULES[@]} -gt 0 ]]; then
3720-
msg_warn "Some modules unavailable for PHP ${PHP_VERSION}: ${FAILED_MODULES[*]}"
3745+
msg_warn "Modules not available for PHP ${PHP_VERSION}: ${FAILED_MODULES[*]}"
3746+
fi
3747+
3748+
if [[ ${#INSTALLED_MODULES[@]} -gt 0 ]]; then
3749+
msg_info "Will install modules: ${INSTALLED_MODULES[*]}"
37213750
fi
37223751

37233752
# install apache2 with PHP support if requested

0 commit comments

Comments
 (0)