Проект Pulse и его две поверхности
В этом самоучителе вы построите Pulse — анализатор потока событий. Одна команда читает NDJSON из stdin и формирует отчёт, а маленький HTTP-адаптер показывает уже подготовленный срез. Предметное ядро остаётся общим, но окружение запуска не прячется за условием PHP_SAPI в случайном месте.
CLI получает аргументы, дескрипторы потоков и код завершения. FPM принимает HTTP-запрос через веб-сервер, создаёт изолированный контекст запроса и возвращает заголовки с телом. Одинаковый класс может быть вызван в обеих средах, если ввод и вывод переданы ему явно.
Жизненный цикл
Процесс не равен запросу
В типичной FPM-конфигурации worker обслуживает последовательность запросов. Локальные переменные запроса исчезают, но статическое или расширенное состояние процесса способно пережить один запрос. Поэтому нельзя считать mutable static безопасным хранилищем пользователя, а освобождение внешнего ресурса оставлять только на надежду о скором завершении процесса.
CLI-команда, наоборот, может работать часами. Для неё важны сигналы остановки, регулярное освобождение пакетов данных и наблюдаемый код завершения. Максимальное время HTTP-запроса и бюджет фоновой обработки — разные эксплуатационные решения.
Явные входы
Диагностическая карта
Запишите для каждого режима четыре факта: кто создаёт процесс, откуда берётся ввод, куда уходит диагностическое сообщение и какой сигнал означает успех. В HTTP ошибку выражают статусом и безопасным телом, а подробность отправляют в журнал. В CLI краткое сообщение идёт в STDERR, данные — в STDOUT, результат автоматизации — в exit code.
Встроенный веб-сервер PHP удобен для локальной разработки, но не становится моделью production-FPM. Его ограничения должны быть явно названы в README, чтобы тестовая простота не превратилась в архитектурное обещание.
Лаборатория
Создайте два тонких адаптера Pulse и прогоните одно событие через оба. Сравните вход, формат результата и поведение при повреждённой строке. Ядро не должно читать суперглобальные переменные.
- STDOUT содержит только машинный результат.
- HTTP-ответ устанавливает Content-Type.
- Одинаковая ошибка получает разные протокольные оболочки, но одну предметную причину.
Закрепите материал
Отметка, заметка, чек-лист и ответы остаются в localStorage этого браузера и не отправляются в аналитику.
Перелинковка со справочником
Проверка актуальности
- php.nethttps://www.php.net/supported-versions.phpПервичный источник для актуализации фактов. Адрес приведён как текст и не является активной ссылкой.
- php.nethttps://www.php.net/manual/en/features.commandline.phpПервичный источник для актуализации фактов. Адрес приведён как текст и не является активной ссылкой.
Текст и схемы созданы для этого самоучителя без воспроизведения страниц, иллюстраций и листингов приложенной книги. Проверено: .