Работа сервера и заблуждения в PHP

Перед написанием HTTP-фреймворка на PHP полезно разобраться в устройстве протокола HTTP. И понять, какими способами мы можем запускать наш программный код на сервере. Использовать ли модуль для Apache или настроить работу по CGI или FastCGI. Либо вообще запустить синхронный или асинхронный сервер на самом PHP.

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

В этом эпизоде мы пройдём полный путь от написания программ на разных языках программирования до запуска их на серверах Apache и Nginx разными способами. От запуска в терминале до использования менеджера процессов и написания нативного сервера. Проследим за каждым нюансом работы в разных окружениях и по разным протоколам:

  • 00:00:07 - Постановка задачи
  • 00:02:12 - Протокол HTTP
  • 00:04:20 - Различия версий HTTP
  • 00:06:35 - Структура HTTP-запроса
  • 00:09:25 - HTTP-ответ сервера
  • 00:10:51 - Форматы тела ответа
  • 00:13:06 - Уточнение запроса
  • 00:14:16 - Операции с записями
  • 00:16:02 - Формат тела запроса
  • 00:18:50 - Формат отправки HTML-форм
  • 00:22:44 - Установка и передача Cookies
  • 00:23:51 - Сходство и различие запроса и ответа
  • 00:24:55 - Выбор сервера для экспериментов
  • 00:25:56 - Установка Apache
  • 00:28:05 - Раздача статических файлов
  • 00:28:55 - Просмотр заголовков в браузере
  • 00:30:56 - HTTP-клиент в PhpStorm
  • 00:32:59 - Запуск PHP-кода через модуль
  • 00:36:02 - Переход к альтернативам
  • 00:36:54 - Протокол CGI
  • 00:37:34 - Запуск программ в терминале
  • 00:38:15 - Потоки ввода и вывода
  • 00:44:11 - Аргументы командной строки
  • 00:44:45 - Переменные окружения
  • 00:46:54 - Написание и запуск программы
  • 00:49:39 - Вывод аргументов
  • 00:50:39 - Отображение stdin и env
  • 00:52:39 - Консольная программа на PHP
  • 00:57:08 - Протокол CGI
  • 00:58:43 - Запуск через CGI в Apache
  • 01:01:29 - Вспомогательные заголовки
  • 01:04:11 - Получение данных запроса
  • 01:08:09 - Получение JSON
  • 01:11:11 - Суперглобальный массив SERVER
  • 01:13:42 - Массивы для CGI
  • 01:14:49 - Использование PHP-CGI
  • 01:16:57 - Динамический запуск скриптов
  • 01:21:45 - Переопределение SCRIPT_FILENAME
  • 01:25:42 - Переход на PHP-CGI
  • 01:27:34 - Встроенные процедуры
  • 01:29:40 - Работа с PHP-CGI в Apache
  • 01:32:42 - Массивы GET и POST
  • 01:35:45 - Массив FILES
  • 01:36:15 - Потоки input и output
  • 01:39:07 - Работа с Cookies
  • 01:41:36 - Устройство сессий в PHP
  • 01:44:43 - Где хранятся данные сессии
  • 01:47:16 - Перенос сессий в другие хранилища
  • 01:49:01 - Промежуточный итог
  • 01:51:43 - Специфические заголовки для сервера
  • 01:53:20 - Сложности реализации HTTP
  • 01:54:56 - Протокол FastCGI
  • 01:56:35 - Спецификация FastCGI
  • 01:58:57 - Менеджер процессов PHP-FPM
  • 02:01:47 - Подключение PHP-FPM к Apache
  • 02:03:12 - Установка Nginx
  • 02:05:27 - Подключение PHP-FPM к Nginx
  • 02:12:11 - Промежуточный итог
  • 02:12:46 - Единый подход в коде
  • 02:14:21 - Написание своего сервера
  • 02:15:17 - HTTP-сервер на JavaScript
  • 02:17:34 - HTTP-сервер на PHP
  • 02:20:42 - Асинхронные серверы для PHP
  • 02:23:02 - Доступ к тексту запроса
  • 02:23:49 - Заблуждения PHP-программистов

И только учитывая всё это мы дальше сможем написать удобный фреймворк, успешно работающий в каждом окружении.

Скрытый контент (код, слайды, ...) для подписчиков. Открыть →
Дмитрий Елисеев
elisdn.ru
Комментарии (30)
Андрей

СУПЕР!!!!!) СПАСИБО!)

Ответить
Дмитрий

Просто "Пушка" - полетел смотреть)) Благодарю

Ответить
BlackCode

А я думал какой сегодня фильм перед выходным днем посмотреть! ) Спасибо!

Ответить
Алексей

Спасибо!

Ответить
Руслан

Спасибо!

Ответить
Максим

Спасибо! Очень познавательно.

Ответить
Arunas

спасибо.

Ответить
Михаил

Спасибо! Отличный материал!

Ответить
Sam

Рекомендуется в качестве ликбеза для начинающих и не только веб программистов!

Ответить
Евгений

Спасибо!

Ответить
Васёк

А продолжение будет, вроде больше выпусков планировалось?

Ответить
Иван

Очень хочется продолжения!

Ответить
Alexey

Так там root права нужны, чтобы в папке создать файл style.css

Как это у вас так без проблем создавалось и об этом не упомянуто ничего?

Ответить
Дмитрий Елисеев

На время записи скринкаста менял права через:

sudo chmod a+rw /var/www/html
Ответить
Никита

Когда следующая часть?

Ответить
Aёct'ann

Полезность данного материала зашкаливает! Спасиииибо)

Ответить
Дмитрий

Про CGI очень познавательно.

Ответить
Герман

Спасибо, очень интересный урок! Дмитрий, подскажите, пожалуйста, а как обрабатываются обычно PUT или PATCH запросы в PHP? Параметры вытаскиваются из массива $_REQUEST?

Ответить
Дмитрий Елисеев

При PUT и PATCH параметры и тела не парсятся в $_POST или $_REQUEST.
Там тело нужно парсить вручную:

$body = file_get_contents('php://input');
parse_str($body, $params);

И уже работать с $params

Ответить
Александр Панков

Спасибо за ваш труд, подскажите пожалуйта, а как работет следующая конструкция

# Cause the PHP interpreter to handle files with a .php extension.
<FilesMatch "\.php$">
        AddType application/x-httpd-php .php
</FilesMatch>

Я нашел ее в одним из коробочных решений, где nginx работает вместе с apache (php7_module) Почему вы писали AddHandler\Action а тут AddType, читаю доку и не могу понять

Получается разница из-за режимов обработки php?

  • AddHandler\Action когда через cgi
  • AddType когда через mod_php (как я нагуглил там не используется cgi, а что тогда?)
Ответить
Дмитрий Елисеев

AddType когда через mod_php (как я нагуглил там не используется cgi, а что тогда?)

В этом случае код запускает сам плагин mod_php внутри Apache напрямую без хождения по CGI.

Ответить
Руслан

Очень крутой и познавательный выпуск. Спасибо

Ответить
Денис

Отличный видос, спасибо. Но все-таки если nginx запускать, можно апач и не стопить, как то это странно звучало, для начинающих не будет понятно). Есть же связки nginx->apache, конечно, сейчас это уже не так актуально. Nginx статику отдает, как прокси работает, но php скрипты отдает на обработку апачу, тот выполняет php скрипты и отдает nginx ответ, чтобы .htaccess использовать и т.п и модули апача.

Т.е запускать nginx на 80 порту апач на 8080 к примеру в связке, можно было про это упомянуть, хоть и видео долгое).

Или если такое не делать, просто использовать разные порты для программ.

Ответить
Дмитрий Елисеев

При связке Nginx > Apache в итоге всё равно HTTP-сервером для PHP оказывается Apache, который просто работает на другом порту. А Nginx просто проксирует к нему запросы по HTTP.

В реальности можно делать какие угодно связки вплоть до:

CloudFlare > Traefik > Nginx > Varnish > Apache

Но наличие скольки угодно прокси-серверов слева не влияет на работу PHP справа.

Ответить
Roman

Отличное видео.

Но есть небольшое (возможно чисто субъективное) замечание: мне показалось, что большАя часть контента повторяется, причем несколько раз как в самом блоке, так и в последующих блоках во время пояснений.

Но содержание, действительно супер... Мне-бы такое лет 15 назад )

Ответить
Алексей

Спасибо! Было бы очень интересно по другим веб-технологиям посмотреть - ключи шифрования, сертификаты, платежные системы и разные веб-АПИ.

Ответить
Алексей

Также интересно узнать про OAuth 2.0, асинхронное программирование и про линукс.

Ответить
Дмитрий Елисеев

Про OAuth 2 мы рассказывали в соседней серии начиная с этого эпизода.

Ответить
Вадим

Очень полезное видео

Ответить
Alexander

Прекрасное видео. Реально восполняет пробелы в понимании процессов, происходящих на стороне web-сервера.

Ответить
Зарегистрируйтесь или войдите чтобы оставить комментарий

Или войти через:

Google
GitHub
Yandex
MailRu