Зарегистрируйтесь, чтобы продолжить обучение

PHP CGI Веб-разработка на PHP

В предыдущем уроке мы создали сайт из одного PHP-файла, печатающего на экран в STDOUT текущий год. Так работает только PHP, потому что это единственный в мире язык, который в своем ядре работает как CGI-скрипт. Это стало причиной его популярности.

Ниже мы увидим основные возможности, которые есть в языке для работы с вебом «из коробки».

После выполнения скрипта index.php все необходимые HTTP-заголовки ответа PHP отправил автоматически. А телом ответа стали данные, которые были отправлены в STDOUT:

curl -v localhost:8080

*   Trying ::1:8080...
* Connected to localhost (::1) port 8080 (#0)
> GET / HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.68.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Host: localhost:8080
< Date: Wed, 27 May 2020 12:13:25 GMT
< Connection: close
< X-Powered-By: PHP/7.4.3
< Content-type: text/html; charset=UTF-8
<
* Closing connection 0

PHP об этом говорит прямо: X-Powered-By: PHP/7.4.3. Заголовки можно менять и добавлять, используя функцию header(). Эта функция принимает на вход строку с одним заголовком, как это делается в HTTP-ответе:

<?php

// file: index.php

// Подробнее о работе функции можно прочитать в документации
header('Cache-control: private, max-age=0');

echo date('Y');

Теперь запрос:

curl --head localhost:8080

HTTP/1.1 200 OK
Host: localhost:8080
Date: Wed, 27 May 2020 12:17:57 GMT
Connection: close
X-Powered-By: PHP/7.4.3
Cache-control: private, max-age=0
Content-type: text/html; charset=UTF-8

Заголовок, установленный с помощью функции header(), появился в ответе. Функцию header() можно вызывать, если клиенту еще не передавались данные. То есть она должна идти в коде первой до любого вывода. Это требование вытекает из устройства HTTP. Сначала идут заголовки и только потом тело:

<?php

echo 'hello';
/* Этот пример приведет к ошибке. Обратите внимание
 * на тег вверху, который будет выведен до вызова header()
 */
header('Location: http://www.example.com/');

Всё, что мы обсудили выше, касается HTTP-ответа, но не менее важно уметь работать с данными HTTP-запроса: посмотреть текущие заголовки, адрес, параметры запроса и его тело. Для этого в PHP реализованы суперглобальные переменные (массивы), которые доступны из любого места программы. К ним относятся:

  • $GLOBALS
  • $_SERVER
  • $_GET
  • $_POST
  • $_FILES
  • $_COOKIE
  • $_SESSION
  • $_REQUEST
  • $_ENV

И хотя чисто технически это обычные массивы, которые можно изменять, большинство из них предназначены только для чтения. Например, массив $_SERVER содержит в себе все заголовки запроса:

Array
(
    [DOCUMENT_ROOT] => /private/tmp
    [REMOTE_ADDR] => ::1
    [REMOTE_PORT] => 58667
    [SERVER_SOFTWARE] => PHP 7.4.3 Development Server
    [SERVER_PROTOCOL] => HTTP/1.1
    [SERVER_NAME] => localhost
    [SERVER_PORT] => 8080
    [REQUEST_URI] => /
    [REQUEST_METHOD] => GET
    [SCRIPT_NAME] => /index.php
    [SCRIPT_FILENAME] => /private/tmp/index.php
    [PHP_SELF] => /index.php
    [HTTP_HOST] => localhost:8080
    [HTTP_USER_AGENT] => curl/7.68.0
    [HTTP_ACCEPT] => */*
    [REQUEST_TIME_FLOAT] => 1530772973.7628
    [REQUEST_TIME] => 1530772973
)

Обратите внимание на формат ключей. PHP автоматически переводит все имена заголовков в верхний регистр. Кроме заголовков этот массив содержит некоторые дополнительные параметры, например, имя запущенного скрипта и версию PHP.

Практически главный ключ в этом массиве — REQUEST_URI. Он содержит адрес запрошенной страницы, и на основе него выбирается подходящее действие.

$_POST содержит данные, отправленные методом POST. А вот $_GET вопреки своему названию, содержит параметры запроса, которые можно отправить с любым методом. При этом не все PHP-программисты это знают и думают, что существует понятие «гет-параметры». Массив $_REQUEST содержит объединенные данные массивов $_POST и $_GET.


Самостоятельная работа

  1. Добавьте в index.php вывод $_SERVER на экран. Обновите страницу в браузере и изучите вывод.
  2. Добавьте в index.php вывод $_GET на экран. Введите адрес localhost:8080/?key=value&key2=value2 и посмотрите на вывод.

Дополнительные материалы

  1. PHP на Repl.it с запущенным веб-сервером

Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы
профессия
Программирование на PHP, Разработка веб-приложений и сервисов используя Laravel, проектирование и реализация REST API
10 месяцев
с нуля
Старт 26 декабря

Используйте Хекслет по-максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»