Wiele wersji PHP na jednym serwerze

Odkąd twórcy PHP wyszli z amoku i zaczęli tworzyć nowe wersje PHP, problem administratorów wrócił. Co prawda o ile na wielu serwerach (jak nie większości) dalej możemy używać wersji PHP 5.6 to  należy pamiętać, że ta wersja już dawno nie jest wspierana i powinniśmy się przesiąść na nowszą. 

W tym właśnie momencie pojawia się nasz problem 🙂 Obecnie wspierane są trzy wersje PHP (7.2, 7.3 oraz 7.4). Dodatkowo nie możemy po prostu zainstalować najnowszej ponieważ nie każdy skrypt będzie kompatybilny (Magento 2 wspiera max PHP 7.2). 

Na nasze szczęście jest prosty sposób na ogarnięcie naszego problemu i możemy mieć PHP w wersjach od 5.6 do 7.4 włącznie. Wystarczy, że nie będziemy używać paczek z dystrybucji, a wspomożemy się dodatkowym repozytorium.

Konfiguracja wielu wersji PHP w systemie Debian 10

Jak skonfigurować nasze środowisko, przedstawię na przykładach dla systemu Debian 10.

Zaczynamy od aktualizacji systemu paczek:

apt-get update

A następnie instalujemy podstawowe pakiety do obsługi repozytorium.

apt-get install -y curl wget gnupg2 ca-certificates lsb-release apt-transport-https

W celu weryfikacji repozytorium pobieramy i instalujemy klucz GPG repozytorium:

wget https://packages.sury.org/php/apt.gpg
apt-key add apt.gpg

Dodajemy plik konfiguracyjny naszego repozytorium

echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/php7.list

A następnie uaktualniamy bazę pakietów o nowy nabytek:

apt-get update

Od teraz możemy zainstalować wybraną wersję PHP np.:

apt-get install -y php7.2 php7.2-cli php7.2-common php7.2-fpm

Możemy teraz sprawdzić posiadaną wersję php poleceniem:

php -v

Możemy dodać oczywiście kolejną wersję PHP np. doinstalować PHP w wersji 7.3:

apt-get install -y php7.3 php7.3-cli php7.3-common php7.3-fpm

Nie będę rozpisywał się nad całą konfiguracją NGINX-a, lecz skupię się tylko na kwestii wielu wersji PHP. Patrząc na konfiguracje wziętą z Magento 2 mamy taki fragment:

upstream fastcgi_backend {
    # use tcp connection
    # server  127.0.0.1:9000;
    # or socket
    server   unix:/run/php/php7.2-fpm.sock;
}

Jeżeli zastanawia was skąd się bierze ścieżka do pliku sock, już spieszę z wyjaśnieniem. Otóż przez zainstalowanie pakietów z repozytorium sury, postała nam bardzo wygodna struktura plików i poleceń. Wystarczy zajrzeć do katalogu /etc/php,a znajdziemy tam numer wersji PHP. Dzięki temu mamy osobne konfiguracje dla każdej wersji PHP. I tak ścieżka do naszego pliku sock znajduje się w pliku:

/etc/php/7.2/fpm/pool.d/www.conf

Konfiguracja php.ini to z kolei:

/etc/php/7.2/fpm/php.ini

A dla CLI:

/etc/php/7.2/cli/php.ini

Jak widać bardzo łatwo odnaleźć się w strukturze plików konfiguracyjnych. Podobnie rzecz się ma w przypadku serwerów PHP-FPM. Należy pamiętać, że mamy tyle serwerów PHP-FPM ile wersji PHP zainstalowaliśmy i są od siebie niezależne.

Tworząc plik pool dla nowej strony należy uważać w którym katalogu go tworzymy. Od tego zależeć będzie uważana wersja PHP

Przykładowo możemy sprawdzić status PHP-FPM dla wersji 7.2 poleceniem:

systemctl status php7.2-fpm

i analogicznie zrestartować:

systemctl restart php7.2-fpm

Dla innych wersji oczywiście wystarczy zmienić „7.2” na interesującą nas wersję.

Wiele wersji PHP, a CLI

Jeżeli chcemy się odwołać z CLI to najlepiej zamiast polecenia php  używać php7.2 dla wersji 7.2 itd.

Oczywiście samo php też zadziała, ale może wskazywać na maksymalnie jedną wersję. Możemy oczywiście zmienić wersję domyślną php za pomocą 1 polecenia. Wpierw jednak musimy wiedzieć gdzie znajduje się plik wykonywalny php interesującej nas wersji:

update-alternatives --query php

To polecenie też pokazuje, która wersja PHP jest obecnie ustawiona. Jeżeli chcemy to zmienić to wykonujemy polecenie (w tym przypadku dla wersji 7.3)

update-alternatives --set php /usr/bin/php7.3

Gdzie ścieżkę wzięliśmy z poprzedniego polecenia, z linii zaczynającej się od „Alternative” i kończącej się na numerze wersji PHP nas interesującej.

Aktualizując samo polecenie php, powinniśmy też zaktualizować polecenia  php-config, phpdbg oraz phpize za pomocą:

update-alternatives --set php-config /usr/bin/php-config7.3
update-alternatives --set phpdbg /usr/bin/phpdbg7.3
update-alternatives --set phpize /usr/bin/phpize7.3

Podsumowanie

Dzięki temu jesteśmy w stanie w prosty sposób zapanować nad naszym serwerem i jednocześnie migrować strony ze starej na nowszą wersję PHP tylko za pomocą edycji pliku NGINX bez przenoszenia tego na inny serwer. W razie problemów zrobienie rollbacka zajmie nam też minimum czasu i nie będzie dotyczyło całego serwera, a jedynie poszczególnej strony. A ostatecznie spowoduje to co dla admina najważniejsze, czas na picie kawy i brak stresu przy migracji 🙂

Dziękuję, że poświęciłeś swój czas na przeczytanie tego artykułu, jeśli masz jeszcze chwilę, podziel się swoimi wrażeniami i >>zostaw komentarz<< w wątku do tego posta.

Scroll to top