Gdy instalujesz PHP bezpośrednio z domyślnych repozytoriów Ubuntu lub Debian przez apt install php, jesteś zablokowany w pojedynczej wersji PHP która została dostarczona z systemem operacyjnym w dniu jego wydania.
Jeśli aktualizujesz aplikację jak WordPress, Laravel, czy Magento, może nagle wymagać PHP 8.2 lub 8.3. Z drugiej strony, jeśli migrujesz starą aplikację, może agresywnie awariować na czymkolwiek nowszym niż PHP 7.4.
Aby to rozwiązać, potrzebujesz możliwości instalacji wielu wersji PHP jednocześnie, uruchamiania ich obok siebie używając PHP-FPM, i mówienia swojemu serwerowi WWW dokładnie której wersji użyć dla której strony internetowej.
Krok 1: Dodaj zaufane repozytorium PHP
Ponieważ domyślne repozytoria OS zawierają tylko jedną statyczną wersję PHP, musimy dodać zaufane repozytorium stron trzecich.
Przez prawie dekadę, globalny standard dla tego był utrzymywany przez Ondřeja Surýego, wysoko szanowanego dewelopera Debiana który zarządza oficjalnymi pakietami PHP.
Najpierw zainstaluj pakiet właściwości oprogramowania (jeśli nie jest już tam):

sudo apt update
sudo apt install software-properties-common ca-certificates lsb-release apt-transport-https -y
Teraz dodaj repozytorium:
Dla Ubuntu:

sudo add-apt-repository ppa:ondrej/php
sudo apt update
Dla Debian:
sudo curl -sSLo /usr/share/keyrings/deb.sury.org-php.gpg https://packages.sury.org/php/apt.gpg
sudo sh -c 'echo "deb [signed-by=/usr/share/keyrings/deb.sury.org-php.gpg] https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list'
sudo apt update
Krok 2: Zainstaluj wiele wersji PHP
Z repozytorium dodanym, masz teraz dostęp do dosłownie każdej wersji PHP (od ultra-prastarej 5.6 do najnowocześniejszej 8.3 i dalej).
Możesz bezpiecznie zainstalować wiele wersji. Nie nadpiszą się ani nie będą ze sobą konfliktować.
Zainstalujmy PHP 8.3 (dla nowoczesnej aplikacji) i PHP 8.1 (dla starszej aplikacji):

# Zainstaluj PHP 8.3 i jego procesor FPM
sudo apt install php8.3 php8.3-fpm php8.3-mysql php8.3-xml php8.3-curl -y
# Zainstaluj PHP 8.1 i jego procesor FPM
sudo apt install php8.1 php8.1-fpm php8.1-mysql php8.1-xml php8.1-curl -y
Po zainstalowaniu, obie usługi PHP-FPM automatycznie zaczną działać w tle niezależnie. Możesz to zweryfikować sprawdzając ich status:

sudo systemctl status php8.3-fpm
sudo systemctl status php8.1-fpm
Krok 3: Przełącz domyślną wersję wiersza poleceń (CLI)
Jeśli wpiszesz php -v w terminalu teraz, wyświetli wersję która była zainstalowana ostatnia.

Jeśli używasz narzędzi terminalowych jak composer czy WP-CLI, musisz zapewnić że domyślna wersja wiersza poleceń PHP pasuje do twojego projektu.
Aby łatwo przełączać domyślną wersję CLI, Linux używa narzędzia o nazwie update-alternatives:

sudo update-alternatives --config php
Zobaczysz wynik podobny do tego:
There are 2 choices for alternative php (providing /usr/bin/php).
Selection Path Priority Status
------------------------------------------------------------
* 0 /usr/bin/php8.3 83 auto mode
1 /usr/bin/php8.1 81 manual mode
2 /usr/bin/php8.3 83 manual mode
Press <enter> to keep the current choice[*], or type selection number:
Po prostu wpisz numer Selection który chcesz (np., 1 dla PHP 8.1) i naciśnij Enter. Zweryfikuj zmianę wpisując php -v ponownie.
Krok 4: Powiedz swojemu serwerowi WWW której wersji użyć
Wersja CLI nie ma wpływu na twój serwer WWW. Nginx i Apache nie obchodzi jaka jest twoja domyślna terminalowa PHP; obchodzi im tylko które gniazdo FPM które jawnie wskażesz im w swoich plikach konfiguracyjnych.
Jeśli używasz Nginx (LEMP Stack):
Otwórz swój Blok Serwera Nginx (np., /etc/nginx/sites-available/default) aby znaleźć blok lokalizacji PHP. Zmień linię fastcgi_pass aby wskazywała na dokładną wersję gniazda której chcesz użyć dla tej konkretnej strony internetowej.
Aby użyć PHP 8.3:
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php8.3-fpm.sock;
}
Aby użyć PHP 8.1 na innym Bloku Serwera, po prostu powiąż je z gniazdem 8.1:
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
}
Zapisz plik i przeładuj Nginx:
sudo systemctl reload nginx
Jeśli używasz Apache (LAMP Stack):
Apache obsługuje FPM nieco inaczej przez a2enconf.
Najpierw wyłącz ogólny moduł PHP:
sudo a2dismod php*
Teraz włącz konkretną konfigurację PHP-FPM której chcesz użyć globalnie:
# Włącz wymagane moduły jeśli jeszcze nie masz
sudo a2enmod proxy_fcgi setenvif
# Włącz PHP 8.3 FPM
sudo a2enconf php8.3-fpm
# LUB całkowicie przełącz na PHP 8.1 FPM
# sudo a2disconf php8.3-fpm
# sudo a2enconf php8.1-fpm
Zrestartuj Apache aby zmiany weszły w życie:
sudo systemctl restart apache2
Krok 5: Edytowanie właściwego php.ini
Gdy musisz zwiększyć swoje upload_max_filesize czy memory_limit, musisz edytować plik php.ini który koreluje dokładnie do wersji i środowiska którego używasz.
Dla Nginx/Apache obsługującego ruch WWW przez PHP 8.3:
sudo nano /etc/php/8.3/fpm/php.ini
Dla Wiersza Poleceń (CLI) obsługującego PHP 8.3:
sudo nano /etc/php/8.3/cli/php.ini
Za każdym razem gdy edytujesz plik fpm/php.ini, musisz zrestartować tę konkretną usługę FPM aby nowe limity pamięci weszły w życie:
sudo systemctl restart php8.3-fpm
Hostowanie wielu aplikacji z drastycznie różnymi wymaganiami dziedzictwa i nowoczesności PHP wymaga serwera z RAM i CPU aby płynnie obsługiwać odmienne pule demonów FPM. Chwyć masowo niezawodny Premium VPS, zainstaluj tyle wersji PHP ilu wymagają twoi klienci i uruchamiaj je jednocześnie bez wycierania potu.