Aktualizácia PHP na verziu 8.1

Cieľ

Chcem aktualizovať PHP na najnovšiu podporovanú verziu na počítači s operačným systémom z rodiny Debian.

PHP je populárny, obľúbený a silný programovací jazyk. Momentálne (november 2021) sa skončila aktívna podpora pre PHP verziu 7.4, oficiálne už bude dostávať len bezpečnostné opravy. Aktívna podpora je pre verzie 8.0 (do 26.11.2022) a 8.1 (do 25.11.2023). Predposledný Debian 10 má predvolenú verziu 7.3 a Debian 11 aj Ubuntu 20.04 LTS majú PHP verziu 7.4, ja by som chcel však aktualizovať na najnovšiu dostupnú verziu PHP 8.1 .

Aktualizácia na novšiu verziu viď Aktualizácia PHP na verziu 8.3 .

Upozornenie

Novšie verzie PHP prinášajú zlepšenia a zvyčajne aj opravy a zrýchlenie, no môžu tak isto odstrániť niektoré vlastnosti, alebo priniesť chyby nové. Takže prechod na novú verziu PHP môže rozbiť funkčnosť systému! Na toto nesmiem zabudnúť. Pred prechodom je potrebné vyskúšať novšiu verziu na neprodukčných serveroch.

Riešenie

Najskôr si stiahnem potrebné pomocné programy, potom podpisový kľúč, potom pridám Ondrejov repozitár medzi zdroje a nakoniec zdroje aktualizujem. Ak už som mal nejakú verziu PHP nainštalovanú tak s veľkou pravdepodobnosťou bude dostupných mnoho aktualizácii.

sudo apt install apt-transport-https lsb-release wget
sudo wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg
sudo sh -c 'echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list'
sudo apt update

V ďalšom kroku si overím aké moduly PHP som mal už nainštalované s poslednou používanou verziou

dpkg --get-selections | grep -i php8.0

Odpoveď bude zoznam všetkých nainštalovaných modulov pre PHP 8.0:

php8.0                                          install
php8.0-cli                                      install
php8.0-common                                   install
php8.0-curl                                     install
php8.0-fpm                                      install
php8.0-opcache                                  install
php8.0-readline                                 install
php8.0-sqlite3                                  install

Podľa tohto zoznamu viem, aké moduly potrebujem nainštalovať:

sudo apt install php8.1 php8.1-cli php8.1-common php8.1-curl php8.1-fpm php8.1-opcache php8.1-readline php8.1-sqlite3

Správnosť inštalácie si overím pomocou php -v, predvolená CLI odpovie číslom verzie:

PHP 8.1.0 (cli) (built: Nov 25 2021 20:49:35) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.1.0, Copyright (c) Zend Technologies
    with Zend OPcache v8.1.0, Copyright (c), by Zend Technologies

Ak mám nainštalovaných viacero verzii PHP, predvolenú verziu môžem zmeniť podľa potreby pomocou:

sudo update-alternatives --config php

Odpoveďou je zoznam nainštalovaných verzii, z ktorých je možné vybrať:

There are 5 choices for the alternative php (providing /usr/bin/php).

  Selection    Path             Priority   Status
------------------------------------------------------------
  0            /usr/bin/php8.1   81        auto mode
  1            /usr/bin/php7.0   70        manual mode
  2            /usr/bin/php7.3   73        manual mode
* 3            /usr/bin/php7.4   74        manual mode
  4            /usr/bin/php8.0   80        manual mode
  5            /usr/bin/php8.1   81        manual mode

Press <enter> to keep the current choice[*], or type selection number:

PHP a systemd

Z PHP ma najviac zaujíma modul php-fpm – „The PHP 8.1 FastCGI Process Manager“ a ten je v Debiane ako aj mnoho iných služieb spúšťaný a riadený pomocou démona systemd.

V predvolenom nastavení php-fpm načúva na unixovom „sockete“.

Môžem zobraziť zoznam všetkých spustených php-fpm:

ss -x -a | grep fpm

Výstup na mojom testovacom Raspberry Pi ukazuje, že PHP-FPM tam beží v piatich rôznych verziách:

u_str  LISTEN  0       0            /run/php/php7.0-fpm.sock 457417
u_str  LISTEN  0       0            /run/php/php7.3-fpm.sock 459851
u_str  LISTEN  0       0            /run/php/php7.4-fpm.sock 477314
u_str  LISTEN  0       0            /run/php/php8.0-fpm.sock 731138
u_str  LISTEN  0       0            /run/php/php8.1-fpm.sock 1109623

Ak chcem po nainštalovaní novšej verzie PHP tú staršiu prestať používať, službu najskôr zastavím a potom ju vypnem:

sudo service php8.0-fpm stop
sudo systemctl disable php8.0-fpm.service

Analogicky môžem opätovne uviesť do prevádzky takto zastavené php-fpm:

sudo systemctl enable php8.0-fpm.service
sudo service php8.0-fpm start

Poznámky

V prípade, že webový server, ktorý používa php-fpm beží pod iným ako zvyčajne používaným užívateľom (www-data) je potrebné buď zmeniť užívateľa webového serveru na www-data alebo upraviť konfiguračný súbor PHP-FPM. Na úpravu konfigurácie potrebujem administrátorsky prístup.

sudo nano /etc/php/8.1/fpm/pool.d/www.conf

Aby server mohol vôbec vykonávať php skripty, zmením prednastavenú hodnotu používateľa unixového socketu z www-data na meno užívateľa pod ktorým beží webový server. Zmenu vykonám na riadku, ktorý začína s listen.owner.

listen.owner = webserver_user_name

Taktiež zmením prednastavenú hodnotu používateľa FPM procesu z www-data na meno užívateľa, ktorý má právo zapisovať do databázy. Zmenu vykonám na riadku, ktorý začína so slovom user.

user = db_user_name

Po akejkoľvek úprave, zmene v konfiguračných súboroch PHP (napr. /etc/php/8.1/fpm/pool.d/www.conf) je potrebné službu reštartovať. Zmeny vykonané v konfiguračných súboroch sa prejavia až po reštarte.

sudo service php8.1-fpm restart

Zdroj