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

- $_GET - масив із GЕТ-параметрами, тобто дані, передані через рядок запиту;
- $_POST - масив із РОSТ-параметрами, передані в тілі НТТР-документа, відправленого на сервер методом POST;
- $_FILES - масив із параметрами завантаженого на сервер файлу;
- $_COOKIE - масив, який забезпечує доступ до даних Cookies, що зберігаються на стороні клієнта та передаються з кожним НТТР-запитом на сервер;
- $_SESSION - масив, який забезпечує доступ до механізму сесій, так само як і Cookies, призначений для зберігання інформації під час переходу від однієї сторінки до іншої. При цьому вся інформація зберігається на сервері, а клієнт обмінюється із сервером лише ідентифікатором сесії;
- $_REQUEST - масив із параметрами, передані скрипту методами POST, GET, а також через Cookie;
- $_ENV - масив із змінними оточення, переданий скрипту Wеb-сервером або командною оболонкою;
- $_SERVER - масив з інформацією про місцезнаходження скрипта, передані йому параметри, сервер, під керуванням якого працює РНР-скрипт, інформацію, передану з НТТР-заголовків клієнтів;
- $_GLOBALS - масив зі змінними з глобальною областю видимості, включаючи значення з масивів $_GET, $_POST, $_COOKIE та $_FILES.
Після встановлення Cookie, значення можна отримати на всіх сторінках Wеb-програми, звертаючись до суперглобального масиву $_COOKIE і використовуючи як ключ ім’я Cookie.
Продемонструємо роботу з Cookie без встановлення часу життя:
Масив $_SESSION перед збереженням у файл піддається серіалізації, тому зберігати серіалізовані дані в сесії вкрай не рекомендується, тобто масиви, що двічі поспіль піддаються дії функції Serialize, найчастіше відновленню не підлягають.
Для завершення роботи сесії необхідно викликати функцію Session_destroy, яка повертає True при успішному знищенні сесії та False – інакше. Якщо нема потреби знищувати поточну сесію, а потрібно лише обнулити всі значення, що зберігаються у сесії, слід викликати функцію Unset. Так само знищується окремий елемент суперглобального масиву $_SESSION:
У файлі php.ini слід знайти директиву Variables_order і переконатися, що вона містить у своєму значенні букву Е. Директива визначає, які суперглобальні масиви будуть доступні до скрипту.
Елемент $_SERVER['DOCUMENT_ROOT'] містить шлях до кореневого каталогу сервера. При виконанні скрипта у віртуальному хості, в цьому елементі, як правило, вказується шлях до кореневого каталогу віртуального хоста.
В елементі $_SERVER['HTTP_ACCEPT'] описуються переваги клієнта щодо типу документа. Вміст цього елемента витягується з НТТР заголовка Accept, який надсилає клієнт до сервера. Заголовок Accept дозволяє уточнити медіатип, який вважає за краще отримати клієнт у відповідь на свій запит. Наприклад:
Кожен медіаряд також характеризується додатковим набором параметрів. Одним з них є так званий відносний коефіцієнт переваги q, який приймає значення від 0 до 1, відповідно, від менш- до більшнеобхідних типів. Якщо коефіцієнт не вказаний, він дорівнює значенню за замовчуванням - 1. Використання кількох параметрів q дозволяє клієнту повідомити серверу відносний ступінь переваги для того чи іншого медіатипу.
В елементі $_SERVER['HTTP_HOST'] міститься ім’я сервера, яке зазвичай збігається з доменним ім’ям сайту, розташованого на сервері.
В елементі $_SERVER['HTTP_REFERER'] міститься адреса, з якої відвідувач прийшов на цю сторінку. Перехід має здійснюватися за посиланням.
Елемент $_SERVER['HTTP_USER_AGENT'] містить інформацію про тип та версію браузера та операційну систему відвідувача. Наприклад:
В елементі $_SERVER['SCRIPT_FILENAME'] міститься абсолютний шлях до файлу від кореня диска.
В елементі $_SERVER['SERVER_NAME'] міститься ім’я сервера, що зазвичай збігається з доменним ім’ям сайту, розташованого на ньому.
Крім описаних параметрів, суперглобальний масив $_SERVER дозволяє з’ясувати ще ряд параметрів сервера, наприклад порт, тип Wеb-сервера, версію НТТР-протоколу, ім’я скрипта, метод і параметри запиту та інші. Для перегляду всіх параметрів достатньо вивести їх на екран функцією Print_r:

Типи суперглобальних масивів
Суперглобальні масиви не обмежені областями видимості функцій та класів і є глобальними. Опишемо повний перелік таких масивів:- $_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 з ім’ям, значенням та необов’язковим терміном дії. Браузер, після отримання цього заголовка - зберігає ім’я та значення або в оперативній пам’яті або в текстовому файлі, якщо куки необхідні і в наступних сеансах. При кожному новому запиті клієнт надсилає серверу НТТР-заголовок 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. Однак при тестуванні в мережі змінна поверне IP-адресу клієнта або останнього проксі-сервера, через який клієнт потрапив на сервер.В елементі $_SERVER['SCRIPT_FILENAME'] міститься абсолютний шлях до файлу від кореня диска.
В елементі $_SERVER['SERVER_NAME'] міститься ім’я сервера, що зазвичай збігається з доменним ім’ям сайту, розташованого на ньому.
Крім описаних параметрів, суперглобальний масив $_SERVER дозволяє з’ясувати ще ряд параметрів сервера, наприклад порт, тип Wеb-сервера, версію НТТР-протоколу, ім’я скрипта, метод і параметри запиту та інші. Для перегляду всіх параметрів достатньо вивести їх на екран функцією Print_r:
print_r($_SERVER);#самовчитель_php 