Этот раздел нужен для быстрой локализации проблем без чтения половины проекта.
Нормальный порядок диагностики такой:
- проверить серверный PHP log;
- открыть
logs/проекта; - запустить
php inc/cli.php help, чтобы убедиться, что bootstrap живой и CLI не падает; - если проблема в маршрутизации, смотреть
logs/router_error/...; - если проблема в фоновых задачах, смотреть
cron_agents,cron_errorи health-screen.
Важно:
- не опирайтесь на query-параметры отладки как на стабильный публичный контракт;
- если в конкретной установке есть локальный low-level debug output в
index.php, считайте это временной инженерной диагностикой, а не частью публичного API EE_FrameWork.
В production должно быть так:
ENV_DEBUG=false;display_errors=0;- публичного
phpinfo()нет; - временные debug-файлы, export-пакеты и тестовые артефакты не лежат в webroot;
- подробности ошибок уходят в logs, а пользователю отдаётся штатный response через
error.php; - AJAX/API получают JSON-ошибку без raw exception dump.
Ad-hoc query-флаги для просмотра runtime state допустимы только как локальная временная диагностика и не должны попадать в production-инструкции.
Сразу после разворачивания проекта временная отладка допустима: в этот момент чаще всего проверяются БД, права на runtime-директории, cron, web-server rewrite и первичный bootstrap. Это отдельный post-install diagnostic mode, а не штатное production-состояние.
Правило:
- debug должен быть явно включён и понятен администратору;
- подробности ошибок остаются в логах, CLI или token-protected диагностике;
- перед публикацией выполняется чеклист отключения debug;
ENV_DEBUG=falseостаётся целевым production-состоянием.
Система логирует через Logger.
Что даёт новый слой:
- уровни
DEBUG/INFO/NOTICE/WARNING/ERROR/CRITICAL/AUDIT; - канал логирования;
request_id;- request context;
- управляемую ротацию;
- единый backend для project logs.
В админке viewer тоже умеет:
- recent-first просмотр;
- архивы логов;
- summary по каналам и размерам.
logs/— project logs;- серверный PHP log;
fatal_errors.txt— shutdown/fatal;- admin logs viewer;
- отдельные каналы по подсистемам вроде
router_error,cache_error,property_values,cron_error.
Для ручной диагностики и служебных запусков используйте единый entrypoint:
php inc/cli.php helpПримеры:
php inc/cli.php ops:health-check
php inc/cli.php diagnostics:file-system --json
php inc/cli.php diagnostics:search-engine --query=hotel --jsonПрактическое правило:
app/cron/— только то, что реально ставится в scheduler;- ручные проверки, health-check и инженерные сценарии идут через
inc/cli.php.
Для production scheduler используется один минутный wrapper:
php app/cron/run.phpА сами периодические задания хранятся в БД как cron-агенты и настраиваются в админке.
Если Router не нашёл контроллер, action или документ, ошибка должна идти через:
error.php
Это касается и docs-модуля:
- неизвестный документ не должен рендериться как «тихая внутренняя 404»;
- он должен попадать в штатный error flow.
- Убедитесь, что файл контроллера существует.
- Очистите route cache.
- Посмотрите
router_errorв логах. - Проверьте rewrite/front-controller конфигурацию веб-сервера.
- Убедитесь, что системный cron реально запускает
php app/cron/run.phpкаждую минуту. - Откройте
/admin/healthи посмотрите блокОповещения системы: там сразу видны stalled cron, failed media queue, stale lifecycle и backup-проблемы. - Проверьте
/admin/cron_agentsи убедитесь, что есть due-агенты, а последний запуск scheduler-а не слишком старый. - Если на health-screen есть stale-состояния, сначала выполните
/admin/recover_stale_operations. - Уже после этого смотрите lock-статусы и лимиты
max_concurrent/max_weight_per_tick. - Проверьте канал
cron_agentsв логах и историю запусков агента. - Если ошибка относится к медиа-очереди, отдельно проверьте
failedиterminal_failedэлементы импорта.
Health-screen теперь не только считает строки в таблицах, но и поднимает alerts по operational-контурам:
- недоступная БД;
- отсутствующие или недоступные для записи системные пути;
- слишком старый минутный cron;
- актуальные ошибки cron-агентов;
- stale lifecycle/media/backup jobs;
- проблемная media queue;
- низкий остаток места на диске.
Если алерт требует действия, на карточке есть прямая ссылка:
- в
/admin/cron_agents; - в
/admin/backup; - или на единое восстановление
/admin/recover_stale_operations.
- Смотрите не только project logs, но и
journalctl -kнаoom-kill. - Сначала проверяйте, не наложились ли несколько запусков
php app/cron/run.php. - Проверьте текущие ограничения памяти:
ENV_MEMORY_LIMIT_WEB
ENV_MEMORY_LIMIT_CLI
ENV_CRON_MEMORY_SOFT_LIMIT_MB
ENV_CRON_AGENT_MEMORY_SOFT_LIMIT_MB
ENV_MEDIA_MIRROR_MEMORY_SOFT_LIMIT_MB
- Если источник нагрузки —
media-mirror-worker, сначала уменьшайтеbatch_limit, а не весь scheduler. - Если задача обязана работать долго, она должна идти порциями и уважать guard-лимиты, а не держать всё в памяти одним проходом.
- Проверьте, что контроллер реально вызывает модель.
- Проверьте
OperationResult. - Посмотрите SQL-ошибки в логах модели.
- Убедитесь, что входные данные не были отфильтрованы до пустого массива.
- Проверьте, не откатили ли транзакцию.
- Проверьте, существует ли файл view.
- Убедитесь, что переменная передана через
View::set(). - Посмотрите, не экранировали ли вы весь HTML как строку.
- Проверьте, не подменяет ли layout
layout_content. - Если публичная часть кешируется — очистите HTML cache.
- Проверьте slug в
custom/docs/manifest.json. - Проверьте, существует ли файл документа в
custom/docs/. - Убедитесь, что alias не указывает в пустоту.
- Проверьте, что маршрут
/docs/...реально доходит доapp/docs/index.php, а не режется веб-сервером раньше PHP. - Очистите route cache, если недавно меняли маршрутизацию.
- Если документа нет, ожидайте переход в
error.php, а не “тихую” внутреннюю 404.
Если вместо error-flow вы видите сырой nginx 404, проверьте ещё и конфигурацию веб-сервера: слишком широкий deny-регекс по внутренним путям может перехватывать публичный docs URL раньше, чем запрос дойдёт до PHP.
В production:
- пользователь не должен видеть raw exception dump;
- разработчик должен получить лог с
request_id, каналом и контекстом; - админская viewer-страница должна помогать, а не скрывать проблему.