Skip to content

chore: upgrade PHP from 7.2 to 8.4.27 - #685

Merged
neSpecc merged 10 commits into
masterfrom
php-8.4-upgrade
Oct 21, 2026
Merged

neSpecc merged 10 commits into
masterfrom
php-8.4-upgrade

Conversation

@neSpecc

@neSpecc neSpecc commented Oct 21, 2026

Copy link
Copy Markdown
Member

21 октября вышло security advisory PHP: две критические RCE-уязвимости (CVE-2026-109618, CVE-2026-109619, CVSS 9.2) затрагивают PHP-FPM. Исправления выпущены только для 8.2–8.5, а PHP 7.2 давно не получает обновлений. Поэтому переводим сайт с php:7.2-fpm на php:8.4.27-fpm-bookworm.

Что изменилось

Docker (docker/php/Dockerfile)

  • Базовый образ php:8.4.27-fpm-bookworm. Bookworm выбран из-за ImageMagick 6: в ImageMagick 7 нет Imagick::setImageOpacity(), а он нужен генератору обложек.
  • Расширения из PECL: memcache 8.2, imagick 3.8.1, redis 6.3.0. Новые флаги конфигурации GD.
  • Убраны правки apt под архив Debian Buster.
  • fc-cache -f при сборке, иначе FPM пишет Fontconfig error: No writable cache directories на каждую генерацию обложки.

Зависимости (www/composer.json, www/composer.lock)

  • codex-team/hawk.php 2.1.4 → 2.3.0: старая версия требует PHP ^7.1.
  • Удалён phpunit/phpunit 3.7: на PHP 8 он не ставится и не запускается, а единственный тест в проекте — SampleTest (1+1).

Совместимость Kohana с PHP 8

  • Arr::path() передавал объект Config_Group в array_key_exists(). На PHP 8 это TypeError, из-за которого падал любой POST-запрос через XSS-фильтр, в том числе форма на /lab.
  • Response::cookie(): each() удалён в PHP 8.0.
  • Image_GD::_do_rotate(): аргумент ignore_transparent у imagerotate() удалён в PHP 8.3.
  • kohana-aliases обновлён до v1.0.0 (Make Model_Uri __sleep and __wakeup public for PHP 8 kohana-aliases#6). Private __sleep/__wakeup в Model_Uri давали предупреждение, которое после каждого старта FPM печаталось в начало страницы.

Прод (www/application/bootstrap.php)

  • В PRODUCTION error_reporting включал E_DEPRECATED. Kohana превращает любую ошибку в исключение, а Kohana 3.3 на PHP 8 выдаёт много deprecation-предупреждений, поэтому без этой правки весь прод отдаёт 500. Теперь deprecation-предупреждения на проде выключены. Убрана и константа E_STRICT: в PHP 8.4 она deprecated.

Как проверено

Локально на php:8.4.27-fpm-bookworm, в режимах DEVELOPMENT и PRODUCTION:

  • главная, /articles, /lab, /join, /contests, /bot, /sitemap.xml отдают 200, новых ошибок в логах Kohana нет;
  • форма на /lab работает анонимно и под пользователем: заявка сохраняется, эмодзи заменяются, уведомление в бот уходит;
  • авторизация через GitHub: редирект, обмен кода на токен и вход по cookie auth_token работают;
  • написание и редактирование статей через Editor.js работают, статьи выводятся в ленту на /articles и на главной;
  • обложки /cover/... генерируются через Imagick.

Загрузку картинок в S3 локально проверить не удалось, нет ключей AWS. AWS SDK на PHP 8.4 доходит до отправки запроса без ошибок.

Что учесть

  • В день релиза PHP pecl.php.net часто отвечает 500, поэтому сборка образа может падать на pecl install. Если так, просто перезапустите сборку.
  • composer audit находит 18 уязвимостей в aws-sdk-php, guzzle, psr7 и jmespath. Это не связано с переходом на PHP 8.4, обновление будет отдельным PR.

Makes Model_Uri __sleep and __wakeup public: PHP 8 warns about private
magic methods and prints the warning into the first page after FPM start.
PHP 8.4.27 fixes CVE-2026-109618 and CVE-2026-109619 (RCE in PHP-FPM),
PHP 7.2 does not get security fixes.

- use Debian Bookworm image: it ships ImageMagick 6 where
  Imagick::setImageOpacity() used by social covers still exists
- install memcache 8.2, imagick 3.8.1 and redis 6.3.0 from PECL
- use new GD configure flags
- build fontconfig cache to avoid errors in FPM logs
- codex-team/hawk.php 2.1.4 requires PHP ^7.1, update to 2.3.0
- phpunit 3.7 can not be installed or run on PHP 8, the only test is a sample
- Arr::path() passed Config_Group to array_key_exists(), which throws
  TypeError since PHP 8.0 and broke every POST request via XSS filter
- replace each() removed in PHP 8.0 in Response::cookie()
- drop imagerotate() ignore_transparent argument removed in PHP 8.3
Kohana converts every reported error into an exception, and Kohana 3.3
raises a lot of deprecations on PHP 8, so production returned 500 on
every page. E_STRICT constant is deprecated in PHP 8.4.
@neSpecc
neSpecc requested a balanced review from Copilot October 21, 2026 19:40

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Changes recommended

GD’s resource-only loading guard discards image transformations when saving or rendering under PHP 8.

1 open issue
What changed in this PR

Migrates the site from PHP 7.2 to PHP 8.4.27, updating dependencies and legacy Kohana code for compatibility.

Changes:

  • Updates the Docker runtime, extensions, and font cache.
  • Upgrades Hawk and removes obsolete PHPUnit dependencies.
  • Adjusts Kohana APIs and production error reporting for PHP 8.
File Description
www/​system/​classes/​Kohana/​Response.php Replaces removed each() with foreach.
www/​system/​classes/​Kohana/​Arr.php Handles ArrayAccess objects in path lookup.
www/​public/​build/​release.json Updates the release timestamp.
www/​modules/​image/​classes/​Kohana/​Image/​GD.php Removes the obsolete rotation argument.
www/​composer.lock Records updated dependencies and removals.
www/​composer.json Removes PHPUnit 3.7.
www/​application/​bootstrap.php Suppresses production deprecation warnings.
docker/​php/​Dockerfile Upgrades PHP and extensions; builds font cache.

Review effort: Balanced

Comment thread www/modules/image/classes/Kohana/Image/GD.php
neSpecc and others added 3 commits October 21, 2026 22:47
Since PHP 8.0 GD returns GdImage objects instead of resources, so
_load_image() treated a loaded image as not loaded and reloaded the
original file on save() and render(), losing rotate, resize and crop.
@neSpecc
neSpecc merged commit 5775903 into master Oct 21, 2026
@neSpecc
neSpecc deleted the php-8.4-upgrade branch October 21, 2026 21:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants