CGI (Common Gateway Interface) — это стандарт, который позволяет веб-серверу запускать внешние программы (обычно известные как CGI-скрипты) для обработки пользовательских запросов и генерации динамического содержимого. Эти CGI-скрипты могут быть написаны на различных языках программирования, включая Perl, Python, Ruby и PHP.
CGI шлюз — это интерфейс который работает таким образом, чтобы можно было использовать любой язык программирования (php, perl, python), который может работать со стандартными устройствами ввода-вывода.
Как CGI работает с PHP
1. Веб-сервер получает HTTP-запрос.
Когда пользователь делает запрос к сайту (например, через браузер), веб-сервер (такой как Apache или Nginx) первоначально получает этот запрос.
2. Определяется необходимость запуска PHP скрипта.
Если запрашиваемый ресурс должен быть обработан PHP-скриптом, веб-сервер передаёт запрос через интерфейс CGI к исполнимому файлу php-cgi
(интерпретатору).
3. Передача данных запроса и запуск скрипта.
PHP запускается как CGI-скрипт в отдельном процессе, через Common Gateway Interface (CGI), передача данных между веб-сервером и PHP происходит через переменные окружения и (для некоторых типов запросов как POST/PUT) через стандартные потоки ввода-вывода.
Вот как это организуется:
- Переменные окружения.
Веб-сервер устанавливает ряд переменных окружения перед тем, как запустить CGI-скрипт. Эти переменные содержат информацию о запросе и сервере. PHP скрипт может получить доступ к этим переменным через суперглобальный массив$_SERVER
в PHP. Некоторые из ключевых переменных окружения включают:SCRIPT_NAME
: путь к исполняемому скрипту.REQUEST_METHOD
: метод HTTP-запроса (например, GET или POST).QUERY_STRING
: строка запроса для метода GET, содержащая параметры и их значения.CONTENT_TYPE
: MIME-тип данных, отправляемых в теле запроса (важен для запросов POST и PUT).CONTENT_LENGTH
: длина тела запроса в байтах (также для POST и PUT).HTTP_*
: все HTTP-заголовки, отправленные браузером (например, HTTP_USER_AGENT, HTTP_COOKIE и т.д.), доступные в PHP как$_SERVER['HTTP_USER_AGENT']
,$_SERVER['HTTP_COOKIE']
и так далее.
- Стандартный ввод (STDIN).
Для некоторых типов HTTP-запросов, таких как POST и PUT, данные запроса не передаются через переменные окружения. Вместо этого, данные с телом запроса передаются через стандартный ввод (STDIN). В PHP вы можете читать эти данные используяphp://input
или функциюfopen('php://stdin', 'r')
.
Это важно, например, при получении JSON или XML данных, или данных из форм, отправленных с типомmultipart/form-data
илиapplication/x-www-form-urlencoded
.
5. Формирование ответа.
PHP скрипт генерирует ответ, который может включать HTML-код, заголовки ответа и другие данные. Выходной поток отправляется обратно веб-серверу через стандартный вывод (STDOUT).
6. Веб-сервер отправляет ответ пользователю.
Веб-сервер получает данные от CGI и отправляет их в браузер пользователя как ответ на исходный запрос.
Недостатки CGI
Самый главный из них это — низкая производительность при высокой нагрузке, т.к. для каждого запроса CGI запускает новый процесс сервера.