Я устанавливаю переменные $_SERVER во включаемый файл следующим образом:
$_SERVER['BOT'] = isset($_SERVER['BOT']) ? $_SERVER['BOT'] : 0; // assume this is not a bot
$_SERVER['REALPAGE'] = isset($_SERVER['REALPAGE']) ? $_SERVER['REALPAGE'] : 0; // assume this is a real page
if (!isset($_SERVER['HOST'])) {
$_SERVER['HOST'] = isset($_SERVER['REMOTE_HOST']) ? $_SERVER['REMOTE_HOST'] : gethostbyaddr($_SERVER['REMOTE_ADDR']);
}
if (!isset($_SERVER['REFERER'])) {
$_SERVER['REFERER'] = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : "";
}
if (!isset($_SERVER['AGENT'])) {
$_SERVER['AGENT'] = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : "";
}
Затем они используются в различных других включениях, чтобы определить, является ли страница реальной или IP-адрес посетителя является BOT.
Я заметил, что хотя с $_SERVER['BOT'], $_SERVER['REALPAGE'], $_SERVER['HOST'] и $_SERVER['REFERER'] проблем нет, иногда $_SERVER[' АГЕНТ'] меняется.
Это потому, что АГЕНТ — зарезервированное слово или что-то в этом роде?
Кстати, у меня нет проблем с их настройкой, хотя исследования здесь, на Stackoverflow и в других местах в Интернете, говорят, что это запрещено. Есть ли причина, по которой у меня нет проблем с их установкой?
«Исследования здесь, на Stackoverflow и в других местах в Интернете, показывают, что это запрещено». - Как бы то ни было, $_SERVER
не доступен и никогда не был доступен только для чтения, и очень популярные пакеты, такие как symfony/dotenv
, могут писать в него. Даже если AGENT
уже существует (например, существует переменная env с таким именем), вы все равно можете ее перезаписать.
Ааа, возможно, мне лучше использовать, скажем, $serverBOT. Это означает, что он не является суперглобальным, но сохраняет свое значение при обработке кода, соответствующего запрошенной странице. Спасибо. Самый полезный.
Пользовательская переменная $_SERVER
$_SERVER['AGENT'] = 'MyValue';
Используйте пользовательскую переменную
echo $_SERVER['AGENT'];
Вопрос касается конкретной проблемы с серверной переменной 'AGENT'
. Не то, как получить доступ к таким переменным вообще.
документация php.net
$_SERVER — это массив, содержащий такую информацию, как заголовки, пути и расположение сценариев. Записи в этом массиве создаются веб-сервером, поэтому нет гарантии, что каждый веб-сервер предоставит что-либо из этого; серверы могут опускать некоторые из них или предоставлять другие, не перечисленные здесь. Однако большинство этих переменных учтены в спецификации » CGI/1.1 и, скорее всего, будут определены. Примечание. При запуске PHP в командной строке большинство этих записей не будут доступны и не будут иметь никакого значения.
Затем они используются в различных других включениях, чтобы определить, является ли страница реальный или IP-адрес посетителя является BOT.
нет никакой полезной причины помещать переменную внутри $_SERVER, поскольку она сбрасывается веб-сервером каждый раз, когда вы перезагружаете страницу. поэтому $AGENT='xxx' и $_SERVER['AGENT']='xxx' имеют одинаковый жизненный цикл
Обратной стороной является то, что если ваш веб-сервер использует в качестве записи «АГЕНТ» (или любой другой ключ, который вы пытаетесь переопределить), у вас может быть какой-то побочный эффект.
Кстати, у меня нет проблем с их настройкой, хотя исследования здесь Stackoverflow и другие сайты в Интернете говорят, что это запрещено. Является есть причина, по которой у меня нет проблем с их установкой?
вы не можете изменить суперглобальное значение, вы сделали это «изменить локальное значение» в «области страницы»
если вы откроете другую страницу или перезагрузите ее (значение записей $_SERVER по-прежнему остается исходным)
«нет никакой полезной причины помещать переменную внутри $_SERVER, поскольку она сбрасывается веб-сервером каждый раз, когда вы перезагружаете страницу. поэтому $AGENT='xxx' и $_SERVER['AGENT']='xxx' имеют одинаковые значения жизненный цикл". Ага, это очень помогает, потому что я никогда толком не понимал, как переменные сохраняют свои значения в коде. Что я делаю, так это создаю главную страницу, а затем включаю различные элементы кода, которые находятся в отдельных файлах. Примерно так же, как раньше делали с подпрограммами. Да, мой опыт программирования восходит к 1970-м и 80-м годам. Спасибо.
Это также может объяснить мою проблему, поскольку в коде у меня также была переменная $agent. Спасибо за предложение.
Используйте оператор ?=
:
$_SERVER['BOT'] ?= 0; // if not set, set it to 0
Вы также можете использовать оператор ??
:
$_SERVER['AGENT'] ?= $_SERVER['HTTP_USER_AGENT'] ?? ""; // ... and if none set, set it to ""
Полный код:
$_SERVER['BOT'] ?= 0;
$_SERVER['REALPAGE'] ?= 0;
$_SERVER['HOST'] ?= $_SERVER['REMOTE_HOST'] ?? gethostbyaddr($_SERVER['REMOTE_ADDR']);
$_SERVER['REFERER'] ?= $_SERVER['REFERER'] ?? $_SERVER['HTTP_REFERER'] ?? "";
$_SERVER['AGENT'] ?= $_SERVER['AGENT'] ?? $_SERVER['HTTP_USER_AGENT'] ?? "";
Также вы можете читать значения, не меняя значения $_SERVER
(если это приемлемо в вашем коде):
$bot = $_SERVER['BOT'] ?? 0;
$page = $_SERVER['REALPAGE'] ?? 0;
$host = $_SERVER['HOST'] ?? $_SERVER['REMOTE_HOST'] ?? gethostbyaddr($_SERVER['REMOTE_ADDR']);
$ref = $_SERVER['REFERER'] ?? $_SERVER['HTTP_REFERER'] ?? "";
$agent = $_SERVER['AGENT'] ?? $_SERVER['HTTP_USER_AGENT'] ?? "";
На первый взгляд, гораздо лучше использовать собственную переменную, скажем
$server
, вместо суперглобальной переменной $_SERVER. При необходимости вы можете инициализировать$server = $_SERVER;
.