| 1 | # PHP Playbook v1 |
| 2 | |
| 3 | ## Purpose |
| 4 | |
| 5 | Операционный контракт для **мира `software.php`** (8.x, ориентир **8.4+**): среда, Composer, SAPI, диагностика, безопасность, полный фундаментальный проход. Детали релиза и рантайма — `kb-php-fundamentals-v1.md`; **карта всех слоёв PHP** — `index-knowledge-php-cluster-v1.md`. **WordPress / Drupal / Symfony full stack / зоопарк Packagist** — `index-knowledge-php-adjacent-ecosystem-v1.md` → целевой kb. |
| 6 | |
| 7 | ## Scope |
| 8 | |
| 9 | - Версия PHP и согласованность сред (local/CI/prod) |
| 10 | - Composer: lock, platform, audit, scripts |
| 11 | - CLI vs php-fpm: разная диагностика |
| 12 | - Миграция минорных/патчей PHP |
| 13 | - Когда грузить какой kb из PHP-кластера |
| 14 | - Смежные платформы на PHP (не Laravel): см. § Adjacent ecosystem |
| 15 | |
| 16 | ## Adjacent ecosystem (WordPress, Drupal, Symfony, Packagist) |
| 17 | |
| 18 | - **Карта:** `index-knowledge-php-adjacent-ecosystem-v1.md` — один целевой kb за запрос. |
| 19 | - **Composer audit, SemVer, Spatie и сторонние пакеты:** `kb-composer-packagist-thirdparty-v1.md` (дополняет контракты этого playbook про lockfile). |
| 20 | |
| 21 | ## Full fundamental pass (миру php) |
| 22 | |
| 23 | Выполнять **последовательно** только при явном запросе «полный проход» / онбординг по PHP (не в каждом чате): |
| 24 | |
| 25 | 0. **Опционально:** `kb-php-versions-and-evolution-v1.md` — если есть легаси 5.x/7.x или нужна хронология фич по мажорам. |
| 26 | 1. `kb-php-fundamentals-v1.md` — платформа, OPcache, 8.4, FPM, JIT/preload outline. |
| 27 | 2. `kb-php-language-semantics-v1.md` — язык, типы, ошибки, ООП. |
| 28 | 3. `kb-php-web-sessions-io-v1.md` — HTTP, сессии, cookies, upload, потоки. |
| 29 | 4. `kb-php-data-persistence-v1.md` — PDO, SQL-дисциплина, транзакции. |
| 30 | 5. `kb-php-tooling-quality-v1.md` — тесты, статанализ, Rector, CI. |
| 31 | |
| 32 | **Миграция между мажорами (5→7→8):** помимо шага 0 — официальные страницы `migration70` … `migration84` на php.net и `UPGRADING` между минорами; KB не заменяет их построчно. |
| 33 | |
| 34 | **Остановка:** после шага, отвечающего на вопрос; не читать следующий kb без нужды. |
| 35 | |
| 36 | ## Evidence-Based Working Format |
| 37 | |
| 38 | - **Fact:** `php -v`, `php -i` (релевантные директивы), SAPI из `php_sapi_name()`. |
| 39 | - **Hypothesis:** ожидаемый эффект изменения. |
| 40 | - **Check:** минимальный reproduce (скрипт, тест, curl). |
| 41 | - **Decision criterion:** тесты + отсутствие новых deprecations в CI при `E_ALL`. |
| 42 | - **Confidence mark:** явно. |
| 43 | |
| 44 | ## Core Contracts |
| 45 | |
| 46 | - Одна **источник правды** по версии PHP: `composer.json` + образ CI + прод-образ. |
| 47 | - `composer.lock` под версионированием для **приложений**. |
| 48 | - Не полагаться на глобально установленный PHP без проверки в проекте. |
| 49 | |
| 50 | ## Runtime Contracts |
| 51 | |
| 52 | - Разделять **веб** (OPcache, fpm workers, timeouts, preload) и **CLI** (`memory_limit`, batch). |
| 53 | - После деплоя: политика сброса OPcache / перезапуск fpm при смене кода. |
| 54 | |
| 55 | ## Dependency Contracts |
| 56 | |
| 57 | - Регулярно `composer audit` в CI. |
| 58 | - Явные `ext-*` в `require`, если без них приложение не поднимается. |
| 59 | |
| 60 | ## Security Contracts |
| 61 | |
| 62 | - Прод: `display_errors=Off`, логирование отдельно от ответа пользователю. |
| 63 | - Секреты через env/secret store; сессии — `session_regenerate_id` при смене уровня доверия (см. `kb-php-web-sessions-io-v1.md`). |
| 64 | |
| 65 | ## Metrics |
| 66 | |
| 67 | - Время CI на целевой версии PHP. |
| 68 | - Deprecations count в логах. |
| 69 | - Инциденты рассинхрона версий / расширений. |
| 70 | |
| 71 | ## Revisit Triggers |
| 72 | |
| 73 | - Обновление PHP в проде; массовые deprecations после `composer update`. |
| 74 | - Смена SAPI (FrankenPHP, Octane, RoadRunner) — пересмотреть таймауты, долгоживущие процессы, OPcache. |
| 75 | |
| 76 | ## Layer (memory-architecture) |
| 77 | |
| 78 | - **L1:** `status-php-laravel-v1.md` → этот playbook. |
| 79 | - **L1 deep:** один или цепочка kb по `index-knowledge-php-cluster-v1.md`. |
| 80 | - **Laravel поверх PHP:** `playbook-laravel-v1.md` (не подменять фреймворком знание рантайма). |
| 81 | |