Cуперглобальный массив $_SERVER в PHP

Давно горела идея создать небольшую шпаргалку, по суперглобальному массиву $_SERVER. В этот массив php интерпретатор записывает все данные полученные от сервера. Интересный момент, что без этих данных в принципе сложно обойтись при создании полноценных веб приложений. По крайней мере как минимум получить текущий домен или на каком протоколе находится сайт — все это возвращает этот массив.

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

Перед тем как приступить, оговорюсь,что сначала мне казалось, что расписать и показать то как работает эта переменная мне казалось простым делом, но подойдя к делу ближе я понял, что не все так сладко. Но не беда, приступим 🙂

DOCUMENT_ROOT — полный путь к документу

В этой переменной хранится полный путь к документу который запущен в текущий момент. Путь начинается с корня, вот пример кода и его вывода:

<?php
   var_dump($_SERVER["DOCIMENT_ROOT"]);
   // string(13) "/var/www/html”
?>

REMOTE_ADDR — получаем IP пользователя который открыл текущий документ

Думаю бывают моменты нужно определить пользователя по его IP, но стоит учитывать, что это может быть не один пользователь, а несколько из одной сети. И все же это полезная функция если мы хотим написать лайки и запретить пользователю лайкать посты более одного раза. Но не всегда этого бывает достаточно.

Пример:

<?php
   var_dump($_SERVER["REMOTE_ADDR"]);
   // string(14) "192.185.134.43" 
?>

HTTP_USER_AGENT — получаем user-agent пользователя, точнее его браузера.

Если изменить ip сегодня не проблема, особенно с помощью vpn который можно качнуть на и установить на свой браузер, то user-agent быстро выдаст этого человека, по крайней мере до тех пор пока он не поменяет свой браузер. Но пока он пользуется своим любимым Google Chrome к примеру, ты всегда знаешь, что это он — как бы он не пытался это скрыть. 

В целом у пользователей встречаются одинаковые user-agent, но если использовать его вместе с IP адресом, получается получается более точное вычисление пользователя, хотя и этого бывает недостаточно. 

Пример:

<?php
   var_dump($_SERVER["HTTP_USER_AGENT"]);
   // string(115) "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36"
?>

Да, да, это мой юзер агент.

HTTP_ACCEPT_LANGUAGE — узнаем на каком языке говорит твой клиент

С этой переменной мы можем узнать на каком языке браузер нашего пользователя. Часто такую штуку применяют на мультиязычных сайтах. Ведь пользователь будет только рад получить именно тот язык который понимает, а не искать возможность перевода.

Стоит помнить что это все в теории и не всегда выходит все максимально идеально. Пример:

<?php
   var_dump($_SERVER["HTTP_ACCEPT_LANGUAGE"]);
   // string(35) "ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7”
?>

HTTP_HOST — получаем текущий хост у учетом порта

На самом деле в рамках какого-то сайта например этого, мы не получим ничего супер полезного кроме названия домена, без учета http или https, грубо говоря получим чисто allfrontend.online, но если бы у моего сайта был бы порт, типа как у локального сервера laravel — localhost:8000, то мы получим именно такую строку.

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

Пример:

<?php
   var_dump($_SERVER["HTTP_HOST"]);
   // если сайт: string(18) "allfrontend.online"
   // если локальный сервер: string(14) "localhost:8080"
?>

SERVER_NAME — получаем имя сервера

А вот здесь мы получаем только localhost без всяких портов и так дальше, но опять таки если это сайт, то получим полное имя документа опять таки без http и https. В принципе если код пишется не универсальный то эта переменная заменит предыдущую. Какую пользовать решишь уже ты как программист.

Пример:

<?php
   var_dump($_SERVER["SERVER_NAME"]);
   // если локалка: string(9) "localhost" 
   // если сайт: string(18) "allfrontend.online" 
?>

SERVER_PORT — получаем порт используемый сервером для соединения

Беспроигрышная штука для определения http или https используется на сайте. Тоесть если человек зашел на сайт по http, то выдаем ему одну информацию, или вообще куда-то редиректим, а если зашел через 443, то выдаем совершенно другую информацию. В целом может быть и другой порт, но чаще всего можно увидеть только эти два. 

Пример:

<?php
  var_dump($_SERVER["SERVER_PORT"]);
  // string(2) "80" - http
  // string(2) "443" - https
?>

REQUEST_SCHEME — Получаем протокол по которому открыт текущий адрес

Часто любят использовать эту штуку для того,чтобы вывести полную ссылку вместе с https, в итоге получается что-то типа:

<?php
   echo $_SERVER["REQUEST_SCHEME"].’://’.$_SERVER["SERVER_NAME"]
   // https://allfrontend.online
?>

Стоит учитывать то, что если у тебя стоит рассчет на https, а ты в текущий момент находишся на http, то и переменная тебе выдаст http. Решение простое — перейти на https, то есть сделать редирект, а после уже все остальное.

SERVER_PROTOCOL — получаем протокол по которому сервер работает и отдает данные 

Эта штука достаточно полезная как оказалось, ведь если наш движек котомый мы написали имеет очень долго грузит контент, а то какой контент он грузит в этом всегда есть большая разница. Не буду вдаваться в то, какая все-таки разница между этими двумя протоколами, но скажу что определяя его мы можем выдать разный контент, к примеру более легкий для старого протокола и более тяжелый для нового протокола.

Второй протокол грузит и отдает контент значительно быстрее так как технологии совершенно разные, и если есть возможность изменить протокол на сервере, так и нужно проступать. 

Пример:

<?php
var_dump($_SERVER["SERVER_PROTOCOL"])
// string(8) "HTTP/1.1"
// или
// string(6) "HTTP/2"
?>

SCRIPT_FILENAME — получаем полный путь к файлу который только что был запущен

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

<?php
  var_dump($_SERVER["SCRIPT_FILENAME"]);
  // string(25) "C:/xampp/htdocs/index.php"
?>

REQUEST_METHOD — Определяем каким методом был отправлен запрос и получен ответ от сервера

Если работать с чистым php, либо фреймворком Laravel, то получение запросов при  формировании Url это достаточно популярная и нужная тема. Так же часто бывает нужно понимать какой запрос мы получаем, что мы можем взять внутри него и так дальше.

Запросы бывают разных типов:

  • GET — получаем данные из ссылки, к примеру если ссылка имеет следующий вид /index.php?variable1=get_query&variable2=allffrontend.online, ты мы можем получить две переменные с значениями “get_query” и “allffrontend.online”
  • POST — проще говоря это невидимый запрос, который человек не может увидеть в ссылке как это в GET запрос. То есть ссылка может быть /index.php, а данных которые не нее мы получили очень много. Например целая огромная статья — на деле POST запросы передаются чаще всего через форму или с помощью технологии Ajax.
  • PUT — метод с помощью которого мы можем сохранять целые файлы, причем делается это значительно проще чем через метод POST. Если в первом мы должны при сохранении файла помещать его во временную папку, то PUT, просто проверяет есть ли такой файл на сервере, и после принимает решение переписать его или создать новый.
  • HEAD — этот запрос сервер генерирует данные похожие на данные у запроса GET, но разница в том, что HEAD не содержит тела элемента, то есть по факту передаются лишь данные и больше ничего. В целом отличный способ сделать проверку и при этом не передавать никаких данных. Как минимум это экономит время выделяемое для передачи данных.
<?php
  var_dump($_SERVER["REQUEST_METHOD"]);
  // string(3) "GET"
?>

В целом ответ может быть разный и так мы понимаем что дальше делать с полученными данными. Но что если нам нужно просто получить строку данных GET?

QUERY_STRING — получаем данные GET из ссылки в виде строки

Представим ситуацию, что у нас есть ссылка такого вида:  /index.php?variable1=get_query&variable2=allffrontend.online, нужно как бы получить просто получить все GET данные, и вот эта переменная нам поможет в этом, в принципе все, вот пример:

<?php
  var_dump($_SERVER["QUERY_STRING"]);
  // string(49) "variable1=get_query&amp;variable2=allffrontend.online" 
?>

Но как видим, все что было до этого в ссылке, а именно index.php, это не вывелось, но сделать это не проблема.

REQUEST_URI — выводит полный url, без домена

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

<?php
  var_dump($_SERVER["REQUEST_URI"]);
  // string(59) "/index.php?variable1=get_query&amp;variable2=allffrontend.online" 
?>

SCRIPT_NAME — можно получить имя файла который запустил и создал текущий документ вместе с путем к файлу от домена (не директории внутри сервера)

Очень редко, но все же бывает нужно получить имя документа, который запустил этот документ. Во всяком случае очень полезная переменная и думаю многим пригодится. Но стоит учитывать, что мы получаем данные вместе с полным путем, то есть если есть пусть типа /folder/folder1/index.php, то мы получим вместе с ними строку. 

<?php
  var_dump($_SERVER['SCRIPT_NAME']);
  // string(17) "/folder/index.php" 
?>

PHP_SELF — можно получить имя файла который запустил и создал текущий документ

Только имя, и больше ничего — бывает нужно получить, правда мне не приходилось использовать эту переменную, но думаю бывают такие случаи — когда нужно.

Пример:

<?php
  var_dump($_SERVER["PHP_SELF"]);
  // string(9) "/test.php" 
?>

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

Если тебе понравился небольшой экскурс по суперглобальному массиву $_SERVER, то не забудь поставить свой большой и жирный лайк ну или простой репостик.

Кроме того ты можешь подписаться на мой бесплатный курс по PHP, где я выкладываю все свои уроки по PHP.

Расслыка по PHP - только эта тема и ничего лишнего! 

Оставьте комментарий