| 1 | # PHP 8.4+ — фундаментальный слой (рантайм и язык) |
| 2 | |
| 3 | **Назначение:** опорная карта PHP как **рантайма** для ветки **8.4+** (и соседних 8.x): версии, SAPI, OPcache, типизация, релиз 8.4, Composer, безопасность, JIT/GC/preload, FPM, расширения. Слой **L1 world** (миру `software.php`). |
| 4 | |
| 5 | **Полный фундаментальный проход по миру PHP:** `index-knowledge-php-cluster-v1.md` → при необходимости **`kb-php-versions-and-evolution-v1.md`** (легаси 5/7, хронология фич) → этот файл → `kb-php-language-semantics-v1.md` → `kb-php-web-sessions-io-v1.md` → `kb-php-data-persistence-v1.md` → `kb-php-tooling-quality-v1.md`. Laravel — отдельно: `kb-laravel-fundamentals-v1.md`. |
| 6 | |
| 7 | **Порядок загрузки (memory-architecture):** `status-php-laravel-v1.md` → `playbook-php-v1.md` → точечный kb (или кластер по карте). |
| 8 | |
| 9 | --- |
| 10 | |
| 11 | ### 1. Ветка PHP 8.x и позиция 8.4 |
| 12 | |
| 13 | - **Fact:** PHP 8.4 выпущен **21.11.2024** (официальный анонс php.net/releases/8.4). Ветка 8.x — текущая линия развития языка; для новых проектов целесообразно оставаться на поддерживаемой минорной версии (8.3/8.4/8.5 по мере выхода патчей). |
| 14 | - **Heuristic:** в любом обсуждении называть **точную минорную версию** (`8.4.x`) и окружение (CLI / php-fpm / встроенный сервер); не смешивать с PHP 7.x или «просто PHP» без версии. |
| 15 | - **First adoption task:** зафиксировать в репозитории `composer.json` → `require.php` и при необходимости `config.platform.php`, чтобы CI и локальная среда совпадали с production. |
| 16 | - **Success criterion:** нет расхождений «локально 8.3, прод 8.4» без явной политики; обновления патчей запланированы. |
| 17 | - **Confidence:** high |
| 18 | |
| 19 | --- |
| 20 | |
| 21 | ### 2. Режимы исполнения и Opcache |
| 22 | |
| 23 | - **Fact:** типичные SAPI: **CLI** (скрипты, Artisan, cron), **php-fpm** / mod_php (веб), реже embed. **OPcache** кеширует байткод и сильно влияет на latency/throughput веб-приложений; в CLI по умолчанию часто отключён или ограничен. |
| 24 | - **Heuristic:** диагностику «тормозит прод» разделять: веб (OPcache, fpm pool, autoload) vs CLI (память, I/O). |
| 25 | - **First adoption task:** для production-веба проверить включение OPcache и политику revalidate; для деплоя — сброс/перезапуск воркеров при выкладке. |
| 26 | - **Success criterion:** понятная матрица «среда → SAPI → что смотреть в первую очередь». |
| 27 | - **Confidence:** high |
| 28 | |
| 29 | --- |
| 30 | |
| 31 | ### 3. Строгость типов и модель языка (8.x) |
| 32 | |
| 33 | - **Fact:** в PHP 8.x усилена типизация: `TypeError` на несовместимых типах, union/intersection types, `readonly`, `enum` (с 8.1), атрибуты; `strict_types=1` задаёт строгую семантику для скаляров в пользовательском коде. |
| 34 | - **Heuristic:** новый код в критичных границах (public API, интеграции) — с явными типами и по возможности `declare(strict_types=1)` в модулях; легаси трогать точечно. |
| 35 | - **First adoption task:** для публичных пакетов описать в README политику strict_types и уровень PHPStan/Psalm. |
| 36 | - **Success criterion:** меньше молчаливых приведений типов на границах системы. |
| 37 | - **Confidence:** high |
| 38 | |
| 39 | --- |
| 40 | |
| 41 | ### 4. Поверхность PHP 8.4 (язык и стандартная библиотека) |
| 42 | |
| 43 | - **Fact (основные темы релиза):** property hooks; asymmetric visibility; lazy objects через Reflection; `array_find`, `array_find_key`, `array_any`, `array_all`; mbstring (`mb_trim` и др.); DateTime микросекунды / `createFromTimestamp`; `#[Deprecated]`; PCRE2 и изменения regex; bcrypt default cost **10→12**; `exit`/`die` как функции; libcurl **≥7.61.0**. Источники: php.net/releases/8.4, php.watch/versions/8.4. |
| 44 | - **Heuristic:** при миграции 8.3→8.4 — тесты, статанализ, deprecations; отдельно **пароли** и **regex**. |
| 45 | - **First adoption task:** CI на PHP 8.4 + `composer validate`. |
| 46 | - **Success criterion:** нет сюрпризов от bcrypt/PCRE/deprecations. |
| 47 | - **Confidence:** high |
| 48 | |
| 49 | --- |
| 50 | |
| 51 | ### 5. Composer и зависимости |
| 52 | |
| 53 | - **Fact:** **Composer** — менеджер зависимостей; `composer.lock` для приложений; `require.php` — минимальная версия PHP; `replace`, `conflict`, `provide` влияют на разрешение. |
| 54 | - **Heuristic:** `composer audit` в CI; private packages — репозитории в `repositories`, не коммитить токены. |
| 55 | - **First adoption task:** `composer install --no-dev` в артефакте деплоя. |
| 56 | - **Success criterion:** воспроизводимые билды. |
| 57 | - **Confidence:** high |
| 58 | |
| 59 | --- |
| 60 | |
| 61 | ### 6. Безопасность и эксплуатация (минимум) |
| 62 | |
| 63 | - **Fact:** прод: без stack trace пользователю; сессии/cookie — secure flags; патчи PHP по каналу ОС/образа. |
| 64 | - **Heuristic:** валидация входа до логики; OWASP Top 10 для веба — вне этого файла, но baseline здесь согласован. |
| 65 | - **First adoption task:** чек-лист: `display_errors=Off`, секреты в env, отдельный пользователь для fpm. |
| 66 | - **Success criterion:** нет утечек трасс; секреты не в git. |
| 67 | - **Confidence:** high |
| 68 | |
| 69 | --- |
| 70 | |
| 71 | ### 7. JIT (OPcache JIT) — когда имеет смысл |
| 72 | |
| 73 | - **Fact:** JIT компилирует горячий opcode в нативный код; выигрыш **зависит от нагрузки** (CPU-bound вычисления в PHP) и может быть незначителен для типичного I/O-bound веба. |
| 74 | - **Heuristic:** бенчмаркировать с реалистичным профилем; не включать «на удачу» без измерений; следить за совместимостью расширений. |
| 75 | - **First adoption task:** сравнить RPS/latency до/после на стейдже для **своего** кода. |
| 76 | - **Confidence:** medium |
| 77 | |
| 78 | --- |
| 79 | |
| 80 | ### 8. Сборка мусора и циклы ссылок |
| 81 | |
| 82 | - **Fact:** refcount + циклический GC; деструкторы и циклы могут откладывать очистку; большие графы объектов — пики памяти. |
| 83 | - **Heuristic:** долгоживущие worker’ы (queue consumer) — периодически сбрасывать состояние или рестарт по политике; не хранить гигантские деревья в памяти без нужды. |
| 84 | - **Confidence:** medium |
| 85 | |
| 86 | --- |
| 87 | |
| 88 | ### 9. Preloading (`opcache.preload`) |
| 89 | |
| 90 | - **Fact:** preloading загружает указанный PHP-скрипт при старте воркера, прогревая классы в OPcache; требует корректного **preload-скрипта** и осознанного порядка зависимостей. |
| 91 | - **Heuristic:** полезно на крупных фреймворках; при обновлении кода — перезапуск fpm; ошибка в preload ломает старт воркера. |
| 92 | - **Confidence:** medium |
| 93 | |
| 94 | --- |
| 95 | |
| 96 | ### 10. Расширения: типичный набор для веба |
| 97 | |
| 98 | - **Fact:** часто нужны: `openssl`, `mbstring`, `intl`, `pdo` + драйвер БД, `json`, `curl`, `zip`, `xml`/`dom` (интеграции); отсутствие ext ломает `composer install` на `ext-*` требованиях. |
| 99 | - **Heuristic:** в `composer.json` явно `ext-*` в `require`; Docker-образы — официальные или с документированным списком ext. |
| 100 | - **Confidence:** high |
| 101 | |
| 102 | --- |
| 103 | |
| 104 | ### 11. php-fpm: пулы и наблюдаемость |
| 105 | |
| 106 | - **Fact:** `pm` (static/dynamic/ondemand), `pm.max_children`, `request_terminate_timeout`, `slowlog` — основные рычаги стабильности; нехватка воркеров → очередь запросов; утечки → исчерпание пула. |
| 107 | - **Heuristic:** мониторить `listen queue`, время ответа; slowlog для запросов > порога. |
| 108 | - **Confidence:** high |
| 109 | |
| 110 | --- |
| 111 | |
| 112 | ### 12. Лимиты `php.ini` (память, время, загрузка) |
| 113 | |
| 114 | - **Fact:** `memory_limit`, `max_execution_time`, `max_input_time`, `upload_max_filesize`, `post_max_size` влияют на веб и CLI по-разному; CLI часто `max_execution_time=0`. |
| 115 | - **Heuristic:** согласовать с reverse proxy (таймауты nginx) и с UX больших upload; не завышать лимиты «на всякий случай» без мониторинга. |
| 116 | - **Confidence:** high |
| 117 | |
| 118 | --- |
| 119 | |
| 120 | ### 13. Веб-сервер vs встроенный `php -S` |
| 121 | |
| 122 | - **Fact:** прод — nginx/apache + fpm (или unit, frankenphp и т.д.); `php -S` только для разработки. |
| 123 | - **Heuristic:** не воспроизводить security/perf поведение прода на встроенном сервере. |
| 124 | - **Confidence:** high |
| 125 | |
| 126 | --- |
| 127 | |
| 128 | ### 14. Reflection и метапрограммирование |
| 129 | |
| 130 | - **Fact:** Reflection API инспектирует классы/атрибуты; **lazy objects** (8.4) завязаны на reflection; DI-контейнеры и сериализаторы используют reflection intensively. |
| 131 | - **Heuristic:** кешировать результаты рефлексии на горячем пути; не строить бизнес-логику на «магии» без тестов. |
| 132 | - **Confidence:** medium |
| 133 | |
| 134 | --- |
| 135 | |
| 136 | ## Registry card (template-knowledge-card-v1) |
| 137 | |
| 138 | ### Provenance (происхождение) |
| 139 | - source_refs: `https://www.php.net/releases/8.4/en.php`; `https://php.watch/versions/8.4`; manual opcache/preload/JIT; KB 2026-02-28, обновлено 2026-03-01 (полный проход). |
| 140 | - created_at: 2026-02-28 |
| 141 | - updated_at: 2026-03-01 |
| 142 | - author: agent-notes KB maintainer |
| 143 | |
| 144 | ### Metadata |
| 145 | - card_id: KC-2026-02-28-PHP-84-L1 |
| 146 | - world: software.php |
| 147 | - layer: world |
| 148 | - tags: php; php-8.4; runtime; composer; opcache; fpm; jit |
| 149 | - status: active |
| 150 | |
| 151 | ### Epistemic Linkage |
| 152 | - epistemic_basis: fact + inference |
| 153 | - evidence_type: official release notes + manual |
| 154 | - confidence: high |
| 155 | - uncertainty: JIT/preload выигрыш — только измерениями на своём коде |
| 156 | - falsification_trigger: смена supported versions на php.net |
| 157 | - transfer_boundary: не переносить на PHP 7.x без проверки |
| 158 | |
| 159 | ### Core Unit |
| 160 | - context: версия, SAPI, прод-поведение, миграция 8.3→8.4 |
| 161 | - signal: perf, opcache, fpm, лимиты ini |
| 162 | - action: §1–14 + кластер `index-knowledge-php-cluster-v1.md` |
| 163 | - outcome: согласованная платформа PHP |
| 164 | - lesson: рантайм = версия + SAPI + ini + расширения |
| 165 | |
| 166 | ### Operationalization |
| 167 | - first_adoption_task: зафиксировать образ PHP и список ext |
| 168 | - validation_check: `php -i` в CI артефакте; health endpoint |
| 169 | - success_criterion: предсказуемое поведение под нагрузкой |
| 170 | - rollback_or_mitigation: откат образа; отключение preload/JIT |
| 171 | |
| 172 | ### Lifecycle |
| 173 | - supersedes: — |
| 174 | - superseded_by: — |
| 175 | - deprecation_reason: — |
| 176 | |