ProfiPHPProfiPHP
  1. Главная
  2. Самоучитель PHP 7
  3. Суперглобальные массивы

Суперглобальные массивы

Процесс обмена по протоколу НТТР между браузером и сервером скрыт от разработчика и реализуется с помощью автоматических механизмов и инструментов - суперглобальных массивов, которые являют собой предопределенные массивы, создаваемые и заполняемые Wеb-сервером и РНР.

Типы суперглобальных массивов


Cуперглобальные массивы не ограничены областями видимости функций и классов и являются глобальными. Опишем полный список таких массивов:

- $_GET - массив с GЕТ-параметрами, то есть данные, переданные через строку запроса;

- $_POST - массив с РОSТ-параметрами, переданные в теле НТТР-документа, отправленного на сервер методом POST;

- $_FILES - массив с параметрами загруженного на сервер файла;

- $_COOKIE - массив, который обеспечивает доступ к Cookies, хранимым на стороне клиента данным, передаваемые с каждым НТТР-запросом на сервер;

- $_SESSION - массив, который обеспечивает доступ к механизму сессий, так же как и Cookies, предназначенный для хранения информации при переходе от одной страницы к другой. При этом вся информация хранится на сервере, а клиент обменивается с сервером только идентификатором сессии;

- $_REQUEST - массив с параметрами, переданные скрипту методами POST, GET, а также через Cookie;

- $_ENV - массив с переменными окружения, переданные скрипту Wеb-сервером или командной оболочкой;

- $_SERVER - массив с информацией о местоположении скрипта, переданных ему параметрах, сервере, под управлением которого работает РНР-скрипт, информацию, переданную с НТТР-заголовками клиентов;

- $_GLOBALS - массив с переменными из глобальной области видимости, включая значения из массивов $_GET, $_POST, $_COOKIE и $_FILES.

Cookie


Лежащий в основе Интернета протокол НТТР не сохраняет информации о состоянии сеанса и любое обращение клиента воспринимает сервером как обращение нового клиента. Для того чтобы различать пользователей, был введен механизм Cookie. Его работа заключается в следующем: сервер отправляет клиенту НТТР-заголовок Set-Cookie с именем, значением и необязательным сроком действия. Браузер, после получения данного заголовка - сохраняет имя и значение либо в оперативной памяти, либо в текстовом файле, если Cookies необходимы и в следующих сеансах. При каждом новом запросе клиент отправляет серверу НТТР-заголовок Cookie с ключом и значением.
Слово Cookie с английского переводится как "кекс" или сладкий бонус, выдаваемый клиентам ресторана, чтобы они запомнили его и посетили вторично.

Для установки Cookie достаточно воспользоваться функцией Setcookie, которая принимает имя Cookie и значение; время в секундах, прошедших с 0 часов 00 минут 1 января 1970 года; путь и домен, по которому доступен Cookie; способ передачи через протокол HTTP или HTTPS и возможность видимости в JavaScript.

После установки Cookie, его значение можно получить на всех страницах Wеb-приложения, обращаясь к суперглобальному массиву $_COOKIE и используя в качестве ключа имя Cookie.
Поскольку Cookie передается в заголовке НТТР-запроса, то вызов функции Setcookie необходимо размещать до начала вывода информации в окно браузера функциями Echo, Print и другими, а также до включения в файл НТМL-тегов.

Если выставляется время жизни Cookie, тогда данные записываются на жестком диске клиента, иначе Cookie размещается в оперативной памяти и действует только до конца сеанса, то есть до того момента, пока пользователь не закроет окно браузера. В этом случае говорят о сессионном Cookie.

Продемонстрируем работу с Cookie без установки времени жизни:
<?php
setcookie('counter', counter());
// Выводим значение cookie
echo "Вы посетили эту страницу {$_COOKIE['counter']} раз";

function counter() {
if (isset($_COOKIE['counter'])) {
++$_COOKIE['counter'];
} else {
$_COOKIE['counter'] = 1;
}
return $_COOKIE['counter'];
}
В данном примере, при каждом обращении к странице устанавливается новое значение Cookie с именем Counter. При этом значение Cookie вычисляется при помощи функции Counter. В случае первого обращения значение $_COOKIE['counter'] не установлено, функция возвращает значение 1, при последующих обращениях, когда посетитель присылает значение Cookie с каждым запросом, $_COOKIE['counter'] будет возвращать присланное значение, которое будет увеличено на единицу.

Сессии


Сессии хранятся в виде пар "ключ/значение", но, в отличии от Cookie, данные в сессии хранятся на стороне сервера, что делает их использование более предпочтительным вариантом, чем Cookies. Для каждого из посетителей сохраняется собственный набор данных в виде уникального номера идентификатора сессии (SID), который передается через Cookies. К основным недостаткам сессий относится сложность контроля времени их жизни из РНР-скриптов, то есть этот параметр задается в конфигурационном файле php.ini директивой Session.cookie_lifetime и может быть запрещен к изменению из скрипта. Оба механизма, сессии и Cookies взаимно дополняют друг друга. Cookies хранятся на компьютере посетителя, и продолжительность их жизни определяет разработчик. Обычно они применяются для долгосрочных задач (от нескольких часов) и хранения информации, которая относится исключительно к конкретному посетителю. В свою очередь, сессии хранятся на сервере, и продолжительность их существования определяет администратор сервера. Они предназначены для краткосрочных задач хранения и обработки информации обо всех посетителях в целом. Поэтому использовать тот или иной механизм следует в зависимости от поставленных целей.
Помимо традиционного хранения сессий на жестком диске в папке, сессии допускают альтернативные механизмы хранения.

Директива Session.save_path в конфигурационном файле php.ini позволяет задать путь к каталогу, в котором сохраняются файлы сессий. Перед тем как начать работать с сессией, клиенту должен быть установлен Cookie с уникальным идентификатором SID, а на сервере должен быть создан файл с данными сессии. Все эти начальные действия выполняет функция Session_start. Она должна вызываться на каждой странице, где происходит обращение к сессии. Точно так же как и функция Setcookie, функция Session_start должна вызываться до начала вывода информации в окно браузера.
При установке директивы Session.auto_start конфигурационного файла php.ini в значение 1, можно добиться автоматического старта сессии, без вызова функции Session start.

После инициализации сессии появляется возможность сохранять информацию в суперглобальном массиве $_SESSION:
<?php
session_start();
$_SESSION['name'] = 'value';
На страницах, где происходит вызов функции Session_start, значения данных переменных можно извлечь из суперглобального массива $_SESSION.

Массив $_SESSION перед сохранением в файл подвергается сериализации, поэтому хранить сериализованные данные в сессии крайне не рекомендуется, то есть массивы, два раза подряд подвергающиеся действию функции Serialize, зачастую восстановлению не подлежат.

Для завершения работы сессии необходимо вызвав функцию Session_destroy, которая возвращает True при успешном уничтожении сессии и False - в противном случае. Если нет необходимости уничтожать текущую сессию, а требуется лишь обнулить все значения, хранящиеся в сессии, следует вызвать функцию Unset. Точно так же уничтожается отдельный элемент суперглобального массива $_SESSION:
unset($_SESSION['name'])

Переменные окружения


Под переменными окружения разумеется определенные параметры, которые могут задаваться на уровне командной оболочки. Для этого необходимо обратиться к суперглобальному массиву $_ENV. Однако, для того, чтобы значение переменной окружения появилось в $_ENV, необходимо предпринять несколько шагов.

В файле php.ini следует обнаружить директиву Variables_order и убедиться, что она содержит в своем значении букву Е. Директива определяет, какие суперглобальные массивы будут доступны скрипту.
Variables_order = "EGPCS"
В примере выше значение директивы содержит символы Е, G, Р, С и S, следовательно, в скрипте будут доступны суперглобальные массивы $_ENV, $_GET, $_POST, $_COOKIE и $_SERVER. Стоит убрать одну из букв, и соответствующий суперглобальный массив будет всегда пустым. После того как переменная окружения передана серверу, к ней можно обратиться из РНР-скрипта как к обычному значению массива:
$_ENV['HELLO'] = 'World';
echo $_ENV['HELLO']; // World

Массив $_SERVER


Массив $_ENV отвечает за внешние переменные окружения. Однако РНР содержит множество внутренних параметров, параметров для формирования НТТР-заголовков ответа, а также параметров, извлеченных из НТТР заголовков, присланных клиентом. Все они содержатся в суперглобальном массиве $_SERVER.

Элемент $_SERVER['DOCUMENT_ROOT'] содержит путь к корневому каталогу сервера. При выполнении скрипта в виртуальном хосте, в данном элементе, как правило, указывается путь к корневому каталогу виртуального хоста.

В элементе $_SERVER['HTTP_ACCEPT'] описываются предпочтения клиента относительно типа документа. Содержимое этого элемента извлекается из НТТР заголовка Accept, который присылает клиент серверу. Заголовок Accept позволяет уточнить медиатип, который предпочитает получить клиент в ответ на свой запрос. Например:
text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Символ * используется для группирования типов в медиаряд. К примеру, символами */* задается использование всех типов, а обозначение type/* определяет использование всех подтипов выбранного типа type. Медиатипы отделяются друг от друга запятыми.

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

В элементе $_SERVER['HTTP_HOST'] содержится имя сервера, которое, как правило, совпадает с доменным именем сайта, расположенного на сервере.

В элемент $_SERVER['HTTP_REFERER'] помещается адрес, с которого посетитель пришел на данную страницу. Переход должен осуществляться по ссылке.

Элемент $_SERVER['HTTP_USER_AGENT'] содержит информацию о типе и версии браузера и операционной системы посетителя. Например:
Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:68.0) Gecko/20100101 Firefox/68.0 
В элементе $_SERVER['REMOTE_ADDR'] помещается IР-адрес клиента. При тестировании на локальной машине этот адрес будет равен 127.0.0.1. Однако при тестировании в сети переменная вернет IР-адрес клиента или последнего прокси-сервера, через который клиент попал на сервер.

В элементе $_SERVER['SCRIPT_FILENAME'] помещается абсолютный путь к файлу от корня диска.

В элементе $_SERVER['SERVER_NAME'] помещается имя сервера, как правило, совпадающее с доменным именем сайта, расположенного на нем.

Помимо описанных параметров, суперглобальный массив $_SERVER позволяет выяснить еще ряд параметров сервера, например, прослушиваемый порт, тип Wеb-сервера, версию НТТР-протокола, имя скрипта, метод и параметры запроса и другие. Для просмотра всех параметров достаточно вывести их на экран функцией Print_r:
print_r($_SERVER);

Добавить комментарий

Имя:
Текст комментария: