@@ -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