Debian i Ubuntu trzymają w oficjalnych repozytoriach tylko jedną wersję PHP — tę, która trafiła do danego wydania. Problem w tym, że realne aplikacje tego nie respektują: stary sklep potrzebuje PHP 7.4, świeży Laravel chce 8.3, a jedno i drugie ma działać na tym samym serwerze. Rozwiązaniem nie jest kompilacja ze źródeł, tylko repozytorium Ondřeja Surýego (packages.sury.org) — to z niego pochodzą pakiety phpX.Y, które można instalować równolegle, obok siebie.
Poniżej cała droga: od dodania repozytorium (nowoczesną metodą, bez przestarzałego apt-key), przez instalację wybranej wersji z PHP-FPM i rozszerzeniami, po ustawienie, która wersja ma być domyślna.
Wszystkie polecenia uruchamiamy jako
rootalbo przezsudo. Przykłady są dla Debiana; na Ubuntu różni się tylko nazwa wydania zwracana przezlsb_release— reszta jest identyczna.
Zobacz całość w akcji#
Zanim przejdziemy do szczegółów — tak wygląda cały proces na czystym Debianie 13: dodanie repozytorium Sury, instalacja PHP 8.3 z rozszerzeniami, druga wersja (7.4) obok i podgląd update-alternatives. Nagranie z prawdziwej sesji, bez montażu.
Przygotowanie — wymagane pakiety#
Do pobrania klucza i obsługi repozytorium po HTTPS potrzebujemy kilku drobiazgów:
| |
Dodanie repozytorium Sury#
W internecie wciąż krąży metoda z apt-key add i kluczem w /etc/apt/trusted.gpg.d/. Nie używaj jej — apt-key jest wycofany (usunięty w Debianie 12+), a klucz w trusted.gpg.d ufa repozytorium dla całego systemu, nie tylko dla PHP. Poprawnie klucz trzymamy w /etc/apt/keyrings/ i przypinamy go do jednego repozytorium przez signed-by:
| |
$(lsb_release -sc) samo podstawia nazwę wydania (bookworm, trixie, noble…), więc tego samego polecenia użyjesz na każdej maszynie.
Instalacja wybranej wersji PHP#
Każda wersja to osobny zestaw pakietów phpX.Y-*. Minimalny, sensowny zestaw dla aplikacji webowej pod Nginx to FPM + CLI + najczęściej używane rozszerzenia. Przykład dla PHP 8.3:
| |
Chcesz inną wersję? Podmień numer. Repozytorium Sury obsługuje pełen zakres — od starych, już niewspieranych wydań, po najnowsze:
| Wersja | Status (2026) | Kiedy jej użyć |
|---|---|---|
php7.2, php7.3 | EOL (bez wsparcia) | tylko legacy, którego nie da się jeszcze zmigrować |
php7.4 | EOL | stare CMS-y i sklepy (np. starszy Magento, WordPress z wtyczkami) |
php8.0, php8.1 | EOL / kończące się wsparcie | aplikacje w trakcie migracji |
php8.2, php8.3 | wspierane | nowe projekty, Laravel, Symfony |
Instalacja np. PHP 7.4 wygląda tak samo — zmienia się tylko prefiks:
| |
Uwaga o bezpieczeństwie. Wersje oznaczone jako EOL nie dostają już poprawek bezpieczeństwa. Instaluj je świadomie — tylko pod konkretną aplikację, która jeszcze nie działa na nowszym PHP, i trzymaj taką usługę za reverse proxy, nie wystawiaj wprost do sieci.
Najczęściej potrzebne rozszerzenia#
Rozszerzenia w repozytorium Sury to po prostu pakiety phpX.Y-<nazwa>. Nie trzeba nic kompilować — wystarczy je doinstalować i zrestartować FPM. Najczęściej spotykane:
| Pakiet | Do czego |
|---|---|
php8.3-mysql | bazy MySQL / MariaDB (PDO) |
php8.3-pgsql | PostgreSQL |
php8.3-curl | zapytania HTTP, API |
php8.3-mbstring | obsługa UTF-8 / wielobajtowych napisów |
php8.3-xml | XML, SimpleXML, DOM |
php8.3-gd lub php8.3-imagick | przetwarzanie obrazów |
php8.3-zip | archiwa (wymaga tego m.in. Composer) |
php8.3-intl | internacjonalizacja, sortowanie wg locale |
php8.3-bcmath | precyzyjna arytmetyka (finanse) |
php8.3-redis, php8.3-memcached | cache, sesje |
php8.3-opcache | kompilacja do bajtkodu — zawsze włącz na produkcji |
Doinstalowanie później i restart puli:
| |
Co masz aktualnie załadowane, sprawdzisz tak:
| |
Kilka wersji obok siebie i domyślne php#
Po zainstalowaniu dwóch wersji masz do dyspozycji oddzielne binaria i usługi:
| |
Polecenie php (bez numeru) wskazuje na jedną z nich — tę wybraną w systemie alternatyw. Którą? Zmienisz to interaktywnie:
| |
| |
To ustawia tylko domyślne php w CLI (np. dla Composera czy skryptów crona). Na to, której wersji użyje konkretna strona WWW, update-alternatives nie wpływa — o tym decyduje pula PHP-FPM wskazana w konfiguracji serwera WWW. I tu dochodzimy do sedna.
PHP-FPM vs mod_php — i wersja per-strona#
Są dwa sposoby na uruchomienie PHP pod serwerem WWW:
libapache2-mod-php— PHP wbudowane w proces Apache. Prostsze w konfiguracji, ale wymusza trybprefork, gorzej skaluje się pod obciążeniem, i co istotne: jeden Apache = jedna wersja PHP. Dla kilku wersji obok siebie odpada.- PHP-FPM — PHP działa jako osobna usługa (FastCGI). Każda wersja ma własną pulę i własny socket, więc różne strony na jednym serwerze mogą używać różnych wersji PHP jednocześnie. Działa i z Nginx, i z Apache (
mod_proxy_fcgi). To domyślny wybór na produkcji.
Każda wersja wystawia własny socket uniksowy:
| |
W Nginx wybór wersji dla danej strony sprowadza się do wskazania właściwego socketu w fastcgi_pass:
| |
Druga strona, która potrzebuje PHP 7.4, dostaje identyczny blok z php7.4-fpm.sock — i tyle. Po zmianie:
| |
Weryfikacja#
Szybki test, że wszystko stoi:
| |
A że PHP faktycznie obsługuje strony — najprościej plikiem info.php z phpinfo() w rootcie strony (po sprawdzeniu skasuj go, ujawnia konfigurację serwera).
Najczęstsze błędy#
EXPKEYSIG ... DEB.SURY.ORG Automatic Signing Key przy apt update — klucz się odświeżył albo jest niekompletny. Pobierz go ponownie do keyringu (nie przez apt-key):
| |
lsb_release: command not found — brakuje pakietu lsb-release z sekcji „Przygotowanie”. Doinstaluj go albo wpisz nazwę wydania na sztywno, np. bookworm, zamiast $(lsb_release -sc).
Unable to locate package php8.3 — repozytorium nie zostało dodane poprawnie albo apt update nie zaciągnął nowej listy. Sprawdź cat /etc/apt/sources.list.d/php-sury.list i powtórz apt update.
Podsumowanie#
Repozytorium Sury załatwia cały problem wielu wersji PHP bez kompilacji: dodajesz klucz nowocześnie przez signed-by, instalujesz phpX.Y-fpm z potrzebnymi rozszerzeniami, a każda wersja dostaje własny socket. Domyślną wersję CLI przełączasz przez update-alternatives, a wersję dla konkretnej strony — jednym wpisem fastcgi_pass w konfiguracji Nginx. Stare wydania instaluj tylko świadomie i nigdy nie wystawiaj EOL-owego PHP wprost do internetu.

