В предыдущем уроке мы создали сайт из одного 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
.
Самостоятельная работа
- Добавьте в index.php вывод
$_SERVER
на экран. Обновите страницу в браузере и изучите вывод. - Добавьте в index.php вывод
$_GET
на экран. Введите адрес localhost:8080/?key=value&key2=value2 и посмотрите на вывод.
Дополнительные материалы
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.