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

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 месяцев
с нуля
Старт 3 апреля
профессия
новый
16 месяцев
с нуля
Старт 3 апреля

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

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

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

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»
Ivan Popov
ТСТопик закрыт
Решено
Отмечено как решение
Решено
Отмечено как решение
Eugen Mulyavka
ТСТопик закрыт
Решено
Отмечено как решение
Решено
Отмечено как решение
Решено
Отмечено как решение
Антон
ТСТопик закрыт
Решено
Отмечено как решение
Sergey Matveev
ТСТопик закрыт