На главную страницу
ПРЕДВАРИТЕЛЬНО ОПРЕДЕЛЕННЫЕ (СУПЕРГЛОБАЛЬНЫЕ) ПЕРЕМЕННЫЕ PHP
В PHP имеется большое количество предопределённых переменных, доступных любому скрипту. Многие эти переменные, однако невозможно полностью задокументировать, так как они зависят от сервера, на котором происходит работа, его версии и установок и других факторов. Некоторые из этих переменных будут недоступны при запуске РНР из командной строки. Если некоторые из переменных не установлены, то соответствующие им значения будут пустыми.
В PHP существует ряд предварительно определенных переменных, которые не меняются при выполнении всех приложений в конкретной среде. Их также называют переменными окружения или переменными среды. Они отражают установки среды Web-сервера Apache, а также информацию о запросе данного браузера. Есть возможность получить значения URL, строки запроса и других элементов HTTP-запроса.
Все предварительно определенные переменные содержатся в ассоциативном массиве $GLOBALS. Кроме переменных окружения этот массив содержит также глобальные переменные. Вывести на экран все значения переменных массива $GLOBALS можно при помощи простого скрипта:
<?php
foreach ( $GLOBALS as $key=>$value )
echo "\$GLOBALS[\"$key\"] == $value ";
?>
СУПЕРГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ PHP
$GLOBALS - содержит ссылку на каждую переменную, доступную в данный момент в глобальной области видимости данного скрипта. Ключами этого массива являются имена глобальных переменных.
$_SERVER - переменные, установленные web-сервером или как-либо иначе относящиеся к среде окружения выполнения текущего скрипта. Аналогичен старому массиву $HTTP_GET_VARS (который не рекомендуется).
$_POST - переменные, предоставляемые скрипту через HTTP POST.
$_COOKIE - переменные, предоставляемые скрипту через HTTP cookies.
$_FILES - переменные, предоставляемые скрипту через HTTP post-загрузку файлов.
$_ENV - переменные, предоставляемые скрипту через среду окружения.
$PHP_ERRORMSG - это переменная, содержащая текст последнего сообщения об ошибке, сгенерированного PHP. Эта переменная доступна только в той области видимости, в которой ошибка возникла, и только если опция конфигурации track_errors включена – on (по умолчанию она выключена - off).
$_REQUEST - переменные, предоставляемые скрипту через любой механизм пользовательского ввода, и которым, следовательно, нельзя доверять.
$_SESSION - переменные, зарегистрированные на данный момент в сессии скрипта.
Переменные суперглобального массива $_SERVER
(серверные переменные)
$_SERVER это массив переменных, содержащий такую информацию, как headers (шапки), paths (пути) и размещение скриптов. Это переменные доступны во всех областях видимости PHP-скрипта, т.е не надо вводить global $_SERVER для доступа к ним, как это делается с $HTTP_SERVER_VARS. Переменные $HTTP_SERVER_VARS содержит ту же самую начальную информацию, но это не являются глобальными.
Присвоение значений переменным в этом массиве осуществляется web-сервером и нет гарантии, что каждый web-сервер будет заполнять все значения переменных. Сервер может опустить некоторые позиции или добавить новые.
'DOCUMENT_ROOT' - корневая директория документов, под которой выполняется текущий скрипт, как определено в файле конфигурации сервера. В частности для локальной машины выдаст содержимое конфигурационного файла httpd.conf:
NameVirtualHost 127.0.0.1:80
<VirtualHost 127.0.0.1:80>
ServerAdmin webmaster@may_domain.ru
DocumentRoot c:/www/mysite
ServerName www.mysite.ru
ServerAlias www.site.ru www.host2.ru
ErrorLog logs/mysite-error.log
CustomLog logs/mysite-access.log common
</VirtualHost>
'GATEWAY_INTERFACE' - какой вариант спецификации CGI используется сервером; например, 'CGI/1.1'.
'HTTP_ACCEPT' - содержимое шапки Accept: из текущего запроса, если имеется.
'HTTP_ACCEPT_CHARSET' - содержимое шапки Accept-Charset: из текущего запроса, если имеется. Пример: 'iso-8859-1,*,utf-8'.
'HTTP_ACCEPT_ENCODING' - содержимое шапки Accept-Encoding: из текущего запроса, если имеется. Пример: 'gzip'.
'HTTP_ACCEPT_LANGUAGE' - содержимое шапки Accept-Language: из текущего запроса, если имеется. Пример: 'en'.
'HTTP_CONNECTION' - содержимое шапки Connection: из текущего запроса, если имеется. Пример: 'Keep-Alive'.
'HTTP_HOST' - содержимое шапки Host: из текущего запроса, если имеется.
'HTTP_REFERER' - адрес страницы (если имеется), который направил пользовательского агента (ПА) на текущую страницу. Устанавливается ПАгентом. Не все ПА будут его устанавливать, а некоторые могут модифицировать HTTP_REFERER. Короче говоря, доверять ему нельзя.
'HTTP_USER_AGENT' - содержимое шапки User_Agent: из текущего запроса, если имеется. Это строка, содержащая информацию о типе и версии браузера и операционной системе посетителя, выполнивший доступ к странице. Типичный пример: Mozilla/4.5 [en] (X11; U; Linux 2.2.9 i586). Помимо прочего, вы можете использовать это значение с get_browser() для приспособления вывода вашей страницы к возможностям клиента. Но в качестве посетителей могут выступать не только пользователи браузеров, но и также роботы поисковых систем, пользователи сотовых телефонов и т.п. В любом случае можно создать программу, которая будут распознавать клиента.
'PATH_TRANSLATED' - путь файловой системы к текущему скрипту, после того как сервер выполнил отображение virtual-to-real.
'PHP_AUTH_PW' - при работу под Apache-модулем и выполнении HTTP-аутентификации, в эту переменную устанавливается password, предоставляемый пользователем.
'PHP_AUTH_TYPE' - при работу под Apache-модулем и выполнении HTTP-аутентификации, в эту переменную устанавливается тип аутентификации.
'PHP_AUTH_USER' - при работу под Apache-модулем и выполнении HTTP-аутентификации, в эту переменную устанавливается username, предоставляемое пользователем.
'PHP_SELF' - имя файла исполняемого в данный момент скрипта; относительно document root. Например, $_SERVER['PHP_SELF'] в скрипте с адресом: http://example.com/test.php/foo.bar Выдаст: /test.php/foo.bar
'QUERY_STRING' - строка запроса, если имеется, по которому был выполнен доступ к странице.
'REMOTE_ADDR' - IP-адрес, с которого пользователь просматривает текущую страницу.
'REMOTE_PORT' - порт на пользовательской машине для соединения с web-сервером.
'REQUEST_METHOD' - какой метод запроса был для доступа к странице; например, 'GET', 'HEAD', 'POST', 'PUT'.
'REQUEST_URI' - URI, который был задан для доступа к данной странице; например, '/index.html'.
'SCRIPT_FILENAME' - абсолютный путь к файлу скрипта, исполняемого в данный момент.
'SCRIPT_NAME' - путь к текущему скрипту. Это используется в страницах, которым нужно указывать на самих себя.
'SERVER_ADMIN' - значение, данное в директиве SERVER_ADMIN (для Apache) в файле конфигурации web-сервера. Если скрипт запущен на виртуальном хосте, это будет значение, определённое для данного виртуального хоста.
'SERVER_ADDR' – IP-адрес сервера.
'SERVER_NAME' - имя хоста (домена) сервера, на котором текущий скрипт выполняется. Если скрипт запущен на виртуальном хосте, это будет значение, определённое для данного виртуального хоста.
'SERVER_PORT' - порт на серверной машине, используемый web-сервером для соединения. По умолчанию это '80'; использование SSL, к примеру, изменит это значение на то, которое вы определили для секретного порта HTTP.
'SERVER_PROTOCOL' - имя и версия информационного протокола, по которому страница запрошена; например, 'HTTP/1.0';
'SERVER_SIGNATURE' - строка, содержащая версию сервера и имя виртуального хоста, добавленная к генерируемым сервером страницам, если эта возможность включена.
'SERVER_SOFTWARE' - строка-идентификатор сервера, даваемая в шапках/headers при ответах на запросы.
Помните без переменных массива $_SERVER сложно организовать полноценную поддержку WEB-приложений.
В примере приводится использование элементов массива $_SERVER для вашего сервера:
<?php
echo 'Имя сервера - '.$_SERVER['SERVER_NAME'].'<br>';
echo 'IP-адрес сервера - '.$_SERVER['SERVER_ADDR'].'<br>';
echo 'Порт сервера - '.$_SERVER['SERVER_PORT'].'<br>';
echo 'Web-сервер - '.$_SERVER['SERVER_SOFTWARE'].'<br>';
echo 'Версия HTTP-протокола - '.$_SERVER['SERVER_PROTOCOL'].'<br>';
?>
Результат работы программы на локальной машине может выглядеть так:
Имя сервера - localhost
IP-адрес сервера - 127.0.0.1
Порт сервера - 80
Web-сервер - Apache/2.0.59 (Win32)
Версия HTTP-протокола - HTTP/1.1
Суперглобальный массив $_FILES
Переменные этого массива содержат всю информацию о загруженных файлах. Использование $_FILES является более предпочтительным. В случае, если конфигурационная директива register_globals установлена значением on, дополнительно будут объявлены переменные с соответствующими именами. По умолчанию для опции register_globals является off.
Содержимое массива $_FILES для нашего примера приведено ниже. Обратите внимание, что здесь предполагается использование имени userfile для поля выбора файла, как и в приведенном выше примере. На самом деле имя поля может быть любым.
$_FILES['userfile']['name'] - Оригинальное имя файла на компьютере клиента.
$_FILES['userfile']['type'] - Mime-тип файла, в случае, если браузер предоставил такую информацию. Пример: "image/gif".
$_FILES['userfile']['size'] - Размер в байтах принятого файла.
$_FILES['userfile']['tmp_name'] - Временное имя, с которым принятый файл был сохранен на сервере.
$_FILES['userfile']['error'] - Код ошибки, которая может возникнуть при загрузке файла.
Замечание: В случае, если register_globals установлена значением on в конфигурационном файле php.ini, будут доступны дополнительные переменные. Например, $userfile_name будет эквивалентна переменной $_FILES['userfile']['name'], а $userfile_type соответствует $_FILES['userfile']['type'], и так далее. Не стоит забывать, что для директивы register_globals значение по умолчанию off. Рекомендуется не полагаться на значение этой директивы.
По умолчанию принятые файлы сохраняются на сервере в стандартной временной папке до тех пор, пока не будет задана другая директория при помощи директивы upload_tmp_dir конфигурационного файла php.ini. Директорию сервера по умолчанию можно сменить, установив переменную TMPDIR для окружения, в котором выполняется PHP. Установка переменной TMPDIR при помощи функции putenv() внутри PHP-скрипта работать не будет. Эта переменная окружения также может использоваться для того, чтобы удостовериться, что другие операции также работают с принятыми файлами.
Проверка загружаемых на сервер файлов
Для получения более детальной информации вы можете ознакомится с описанием функций is_uploaded_file() и move_uploaded_file(). Следующий пример принимает и обрабатывает загруженный при помощи формы файл.
<?php
// В PHP 4.1.0 и более ранних версиях следует использовать $HTTP_POST_FILES
// вместо $_FILES.
$uploaddir = '/var/www/uploads/';
$uploadfile = $uploaddir . basename($_FILES['userfile']['name']);
print "<pre>";
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile))
{
print "File is valid, and was successfully uploaded. ";
print "Here's some more debugging info:\n";
print_r($_FILES);
}
else
{
print "Possible file upload attack! Here's some debugging info:\n";
print "Possible file upload attack! Дополнительная отладочная информация:\n";
print_r($_FILES);
}
print "</pre>";
?>
PHP-скрипт, принимающий загруженный файл, должен реализовывать логику, необходимую для определения дальнейших действий над принятым файлом. Например, вы можете проверить переменную $_FILES['userfile']['size'], чтобы отсечь слишком большие или слишком маленькие файлы. Также вы можете использовать переменную $_FILES['userfile']['type'] для исключения файлов, которые не удовлетворяют критерию касательно типа файла. Можно использовать $_FILES['userfile']['error'] и разъяснение сообщений об ошибках при реализации вашей логики. Независимо от того, какую модель поведения вы выбрали, вы должны удалить файл из временной папки или переместить его в другую директорию.
В случае, если при отправке формы файл выбран не был, PHP установит переменную $_FILES['userfile']['size'] значением 0, а переменную $_FILES['userfile']['tmp_name'] - пустой строкой. none.
По окончанию работы скрипта, в случае, если принятый файл не был переименован, или перемещен он будет автоматически удален из временной папки.
Смежные замечания по конфигурации: Также ознакомьтесь с описанием директив file_uploads, upload_max_filesize, upload_tmp_dir, max_input_time и post_max_size конфигурационного файла php.ini.
В начало страницы
|