Практичний гайд за підходом Ayesh Karunaratne: установка та оновлення PHP 8.4 на Ubuntu і Debian

У статті розбирається підхід Ayesh Karunaratne до безпечного оновлення середовища: PHP 8.4 встановлюється поруч з чинною версією, а не поверх неї, з можливістю відкотитися. Джерелом пакетів виступають репозиторії Ondřej Surý для Debian та Ubuntu.

Installation and Upgrade for PHP 8.4 on Debian and Ubuntu

1. Що змінюється при переході на PHP 8.4

PHP 8.4 додає нові можливості (hooks для властивостей, асиметричну видимість, зміни в DOM, Curl, PCRE), але водночас впливає на сумісність зі старим кодом.

Автор виділяє кілька важливих моментів, які можуть зламати чинні застосунки або засипати лог додатковими попередженнями:

  • застаріле неявне nullable оголошення параметрів (див. деталі);
  • депрекація константи E_STRICT (опис);
  • винесення з ядра до PECL кількох розширень: Pspell, IMAP, OCI8 і PDO_OCI.

Коли розширення переходить до PECL, воно отримує власний цикл релізів. Репозиторій Ondřej Surý постачає бінарні пакети цих розширень, але темп оновлень залежить від підтримки в самому PECL. Це означає, що такі модулі інколи відстають за оновленнями і їх стан потрібно контролювати окремо.

Перед будь яким оновленням автор рекомендує зробити резервну копію системи. Описана далі схема установки дозволяє тримати PHP 8.4 поруч з поточною версією і в разі проблем швидко повернутися до старої.

2. Фіксація поточного набору PHP пакетів

Цей крок потрібен саме при оновленні існуючого оточення. Ідея в тому, щоб зафіксувати список встановлених PHP пакетів і потім відтворити його вже в гілці 8.4.

Команда виводить усі пакети з підрядком php в назві, показує їх у консолі і паралельно пише до файлу packages.txt:

dpkg -l | grep php | tee packages.txt

Надалі цей файл використовують як референс, щоб перевірити, чи не забули ви якесь розширення при установці варіантів під 8.4.

3. Підключення репозиторіїв Ondřej Surý

У стандартних репозиторіях поточних релізів Debian і Ubuntu на момент публікації PHP 8.4 немає. Тому автор використовує сторонній, але де-факто стандартний для PHP на цих дистрибутивах набір репозиторіїв від Ondřej Surý.

Після додавання цих джерел пакети PHP 8.4 встановлюються і оновлюються так само, як і звичайні системні пакети через apt.

3.1. Ubuntu — додавання PPA

Для Ubuntu використовується PPA:

sudo LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php # Press enter to confirm.
sudo apt update

add-apt-repository ppa:ondrej/php додає джерело, apt update оновлює списки пакетів.

3.2. Debian — додавання DPA

У Debian налаштування трохи довше: потрібно встановити допоміжні пакети, завантажити ключ для підпису і додати новий запис до sources.list.d:

sudo apt-get update
sudo apt-get -y install lsb-release ca-certificates curl apt-transport-https
sudo curl -sSLo /tmp/debsuryorg-archive-keyring.deb https://packages.sury.org/debsuryorg-archive-keyring.deb
sudo dpkg -i /tmp/debsuryorg-archive-keyring.deb
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-get update

Ключовий момент — рядок з deb [signed-by=...] https://packages.sury.org/php/ $(lsb_release -sc) main. Він підключає репозиторій PHP, підписаний встановленим ключем. Після останнього apt-get update пакети PHP 8.4 стають доступні системі.

4. Вибір і установка SAPI: CLI, Apache модуль чи FPM

У репозиторіях Ondřej Surý пакети PHP версії 8.4 називаються за маскою php8.4-NAME (для SAPI і розширень). Перед встановленням модулів важливо вирішити, як саме PHP буде працювати на сервері.

4.1. Тільки PHP CLI

Якщо PHP потрібен лише для консольних утиліт, скриптів, cron задач, автор пропонує обмежитись пакетом php8.4-cli:

sudo apt install php8.4-cli

Після цього можна окремо догортати будь які потрібні розширення (наприклад, php8.4-mbstring, php8.4-intl).

4.2. PHP як модуль Apache

Для сценаріїв, де застосунок прив'язаний до mod_php, ставиться комбінація CLI + модуль Apache:

Приклад коду в оригіналі

Автор зауважує, що якщо застосунок прямо не вимагає mod_php, краще розглянути FPM як більш гнучкий варіант інтеграції з веб сервером.

4.3. PHP CLI + PHP FPM (рекомендований варіант)

Рекомендація автора — інтегрувати PHP із веб серверами (Apache, Nginx, Caddy) через PHP FPM:

Приклад коду в оригіналі

Пакет php8.4-fpm встановлюється як systemd сервіс і відразу активується. Пізніше його підключають у конфігурації веб сервера через сокет або TCP порт.

5. Перевірка встановлення та базові діагностики

Після базової установки автор радить перевірити дві речі: версію PHP та стан FPM сервісу (якщо той встановлений).

5.1. Перевірка версії PHP CLI

Команда:

Приклад коду в оригіналі

Виведе версію PHP, час збірки та додаткову інформацію про збірку.

`php -v` output
`php -v` output

5.2. Статус сервісу php8.4 fpm

Для FPM стан перевіряють через systemd:

Приклад коду в оригіналі

У разі успішного запуску статус буде показувати, що сервіс активний, без помилок у журналі.

php-fpm status
`systemctl status php8.4-fpm` output

6. Установка розширень PHP 8.4

Усі динамічні розширення для цієї версії слідують схемі імен php8.4-EXTNAME. Якщо ви оновлюєте наявний сервер, зручно звірятися з файлом packages.txt, отриманим на першому кроці: які php8.3-* стояли раніше, такі ж php8.4-* можна підібрати для нової версії.

6.1. Приклад установки одного модуля

Для розширення gd використовується пакет:

Приклад коду в оригіналі

6.2. Набір типових розширень для фреймворків

Автор наводить приклад команди, що встановлює «джентльменський набір» найчастіше вживаних модулів (математика, архівація, мережа, локалізація, рядки, кеш тощо):

Приклад коду в оригіналі

Щоб подивитися повний список доступних розширень для PHP 8.4, можна скористатися пошуком по пакетах:

Приклад коду в оригіналі

6.3. Інструменти для розробки (не для продакшну)

Окрема група — розширення для налагодження та збору покриття коду. Автор прямо застерігає не ставити їх на бойові сервери через накладні витрати й потенційні ризики.

Xdebug

Для налагодження:

Приклад коду в оригіналі

PCOV

Для покриття коду:

Приклад коду в оригіналі

7. Інтеграція PHP 8.4 з веб сервером

Коли в системі з'явилися нові SAPI, потрібно налаштувати зв'язку з веб сервером, інакше запити й далі підуть через стару версію PHP.

7.1. PHP FPM + Apache, Nginx, Caddy

Якщо використовується FPM, головна задача — оновити шлях до сокета або конфіг файл, який на нього посилається.

Apache з FPM

У Apache достатньо активувати готову конфігурацію для PHP 8.4 FPM:

Приклад коду в оригіналі

Після цього Apache почне проксувати PHP запити на новий FPM сервіс.

Nginx + PHP 8.4 FPM

У Nginx потрібно змінити директиву fastcgi_pass, замінивши старий сокет на новий:

Приклад коду в оригіналі

Офіційні деталі по конфігурації — в документації Nginx.

Caddy Server + PHP 8.4 FPM

Для Caddy змінюється шлях у reverse_proxy:

Приклад коду в оригіналі

Розширений гайд по Caddy з PHP наведено в матеріалі автора How to use Caddy Server with PHP.

7.2. PHP як модуль Apache

Якщо PHP інтегровано як mod_php, то для переходу на 8.4 потрібно відключити старий модуль і увімкнути новий. У прикладі автор оперує переходом з 8.3 на 8.4:

Приклад коду в оригіналі

Коментар у першому рядку нагадує підставити актуальну стару версію, якщо у вас інший перехід (наприклад, з 8.1).

8. Перенесення конфігурації з попередньої версії

Конфігураційні файли PHP 8.4 розміщені в /etc/php/8.4, а старі — у відповідних /etc/php/VERSION. Пряма заміна каталогів може спричинити проблеми, тому автор радить не копіювати файли цілком, а акуратно зводити відмінності.

Приклад порівняння php.ini CLI між 8.3 і 8.4:

Приклад коду в оригіналі

На основі виводу diff можна вибірково переносити потрібні параметри в новий php.ini. Для FPM додатково варто привести до ладу /etc/php/8.4/fpm/pool.d/www.conf, щоб він відповідав налаштуванням попереднього пулу (користувач, група, шляхи до логів, ліміти тощо).

9. Видалення старих версій PHP

Коли ви переконалися, що PHP 8.4 і, за потреби, його інтеграція з веб сервером працюють коректно, можна почати очистку від старих пакетів.

Автор показує приклад для гілки 8.3:

Приклад коду в оригіналі

Тут використовується регулярний вираз у лапках, який через apt purge видаляє всі пакети, назва яких починається з php8.3. Перед запуском такої команди доцільно ще раз перевірити список видалених пакетів, щоб не зачепити нічого зайвого.

10. Паралельний запуск кількох версій PHP

Якщо старі версії ще потрібні (наприклад, для підтримки різних проєктів), описаний підхід дозволяє тримати їх поруч з 8.4.

CLI бінарники ставляться з версіонованими назвами: /usr/bin/php8.4, /usr/bin/php8.3 тощо. За замовчуванням команда php посилається (через symlink і механізм alternatives) на найновішу версію. Це можна змінити вручну.

10.1. Вибір версії через update alternatives

Інтерактивний вибір реалізовано командою:

Приклад коду в оригіналі

Вона відкриває список доступних альтернатив:

Приклад коду в оригіналі

Можна задати потрібний шлях і без діалогу, якщо відома ціль:

Приклад коду в оригіналі

Таким чином, на одному сервері зберігається кілька CLI версій PHP, а команда php вказує на ту, яку ви зафіксували через update-alternatives.

11. Куди дивитися далі


Джерело: Ayesh Karunaratne — PHP.Watch: статьи

Пошук

Закрити