У статті розбирається підхід Ayesh Karunaratne до безпечного оновлення середовища: PHP 8.4 встановлюється поруч з чинною версією, а не поверх неї, з можливістю відкотитися. Джерелом пакетів виступають репозиторії Ondřej Surý для Debian та 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, час збірки та додаткову інформацію про збірку.

5.2. Статус сервісу php8.4 fpm
Для FPM стан перевіряють через systemd:
У разі успішного запуску статус буде показувати, що сервіс активний, без помилок у журналі.

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. Куди дивитися далі
- Огляд і самі репозиторії Ondřej Surý — на Launchpad;
- Окремий матеріал з нововведень PHP 8.4 — What's new and changed in PHP 8.4;
- Опис змін у циклі релізів PHP — PHP Release Cycle Update.
Джерело: Ayesh Karunaratne — PHP.Watch: статьи