Самоучитель: PHP под капотом: runtime и стандартная библиотека
Глава 1 из 20I. Среда выполнения85 минут

Глава 1. Один PHP-код, разные режимы запуска

PHP-программа получает разный контракт в CLI и FPM: меняются источник входа, срок жизни процесса, заголовки и способ сообщить об ошибке.

После главы вы сможете
  • различать SAPI и процесс
  • описывать request lifecycle
  • не переносить CLI-допущения в HTTP

Проект Pulse и его две поверхности

В этом самоучителе вы построите Pulse — анализатор потока событий. Одна команда читает NDJSON из stdin и формирует отчёт, а маленький HTTP-адаптер показывает уже подготовленный срез. Предметное ядро остаётся общим, но окружение запуска не прячется за условием PHP_SAPI в случайном месте.

CLI получает аргументы, дескрипторы потоков и код завершения. FPM принимает HTTP-запрос через веб-сервер, создаёт изолированный контекст запроса и возвращает заголовки с телом. Одинаковый класс может быть вызван в обеих средах, если ввод и вывод переданы ему явно.

Жизненный цикл

Два адаптера одного ядраСреда преобразует собственный ввод в команду ядра и переводит результат обратно, не смешивая протоколы.stdin/argvCLIAdaptercommandPulse coreeventsAdapterresponsestdout/HTTPresult
Среда преобразует собственный ввод в команду ядра и переводит результат обратно, не смешивая протоколы.

Процесс не равен запросу

В типичной FPM-конфигурации worker обслуживает последовательность запросов. Локальные переменные запроса исчезают, но статическое или расширенное состояние процесса способно пережить один запрос. Поэтому нельзя считать mutable static безопасным хранилищем пользователя, а освобождение внешнего ресурса оставлять только на надежду о скором завершении процесса.

CLI-команда, наоборот, может работать часами. Для неё важны сигналы остановки, регулярное освобождение пакетов данных и наблюдаемый код завершения. Максимальное время HTTP-запроса и бюджет фоновой обработки — разные эксплуатационные решения.

Явные входы

Диагностическая карта

Запишите для каждого режима четыре факта: кто создаёт процесс, откуда берётся ввод, куда уходит диагностическое сообщение и какой сигнал означает успех. В HTTP ошибку выражают статусом и безопасным телом, а подробность отправляют в журнал. В CLI краткое сообщение идёт в STDERR, данные — в STDOUT, результат автоматизации — в exit code.

Встроенный веб-сервер PHP удобен для локальной разработки, но не становится моделью production-FPM. Его ограничения должны быть явно названы в README, чтобы тестовая простота не превратилась в архитектурное обещание.

Лаборатория

Создайте два тонких адаптера Pulse и прогоните одно событие через оба. Сравните вход, формат результата и поведение при повреждённой строке. Ядро не должно читать суперглобальные переменные.

  • STDOUT содержит только машинный результат.
  • HTTP-ответ устанавливает Content-Type.
  • Одинаковая ошибка получает разные протокольные оболочки, но одну предметную причину.
Локальный прогресс

Закрепите материал

Отметка, заметка, чек-лист и ответы остаются в localStorage этого браузера и не отправляются в аналитику.

Контрольная карта лаборатории

Выполнено: 0 из 3

Локальный тест

1. Что является правильной общей частью CLI и FPM?
2. Куда CLI-команде отправлять машинный результат?

Перелинковка со справочником

Проверка актуальности

  • php.nethttps://www.php.net/supported-versions.phpПервичный источник для актуализации фактов. Адрес приведён как текст и не является активной ссылкой.
  • php.nethttps://www.php.net/manual/en/features.commandline.phpПервичный источник для актуализации фактов. Адрес приведён как текст и не является активной ссылкой.

Текст и схемы созданы для этого самоучителя без воспроизведения страниц, иллюстраций и листингов приложенной книги. Проверено: .

Данные этого сервиса

Настройки cookie и локальных данных

Аналитика

Текущий статус: не выбран. До согласия обе аналитические системы не загружаются.

Локальные данные

Удаление затрагивает только ключи PHP-сервиса в этом браузере и требует подтверждения.

Политики

Политика конфиденциальности · Политика использования файлов cookie