Лекция 4

Алтернативная запись циклов - это альтернативный синтаксис для некоторых его управляющих структур, а именно: if, while, for, foreach и switch.

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

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

Суперглобальные переменные - являются встроенными переменными, которые всегда доступны во всех областях видимости.

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

Имя переменнойОписание
$GLOBALSСодержит все глобальные переменные, доступные локальному сценарию. Имена переменных используются в качестве индексов массива.
$_SERVERСодержит информацию об окружении веб-сервера.
$_GETСодержит информацию о запросах GET (при отправке форм). Эти значения следует обязательно проверять перед использованием.
$_POSTСодержит информацию о запросах POST (другой тип отправки данных формы). Эти значения следует обязательно проверять перед использованием.
$_FILESСодержит информацию о файлах, загружаемых методом POST.
$_COOKIEСодержит информацию о cookies HTTP.
$_SESSIONСодержит информацию из всех переменных, зарегистрированных в рамках сессии.
$_REQUESTСодержит информацию о пользовательском вводе. Эти значения следует обязательно проверять перед использованием. Вместо этого массива следует использовать $_GET или $_POST, т.к. они более специализированные.
$_ENVСодержит информацию об окружении сценариев.

$GLOBALS

Ассоциативный массив (array), содержащий ссылки на все переменные глобальной области видимости скрипта, определенные в данный момент. Имена переменных являются ключами массива.

				
	$x = 2;
	function my_func() {
		echo $_GLOBAL["x"]++ // инкрементирование глобальной переменной 
	}
				
			
См. sample1.html, sample1.php

$_SERVER

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

Ниже приведён пример некоторых индексов $_SERVER

HTTP_USER_AGENT
Эта строка содержит обозначение браузера, которым пользователь запросил данную страницу. Вы можете использовать это значение с функцией get_browser() чтобы адаптировать вывод вашей страницы к возможностям браузера пользователя
REMOTE_ADDR
IP-адрес, с которого пользователь просматривает текущую страницу.
SERVER_ADDR
IP адрес сервера, на котором выполняется текущий скрипт.
PHP_SELF
Имя файла скрипта, который сейчас выполняется, относительно корня документов. Например, $_SERVER['PHP_SELF'] в скрипте по адресу http://example.com/foo/bar.php будет /foo/bar.php.
HTTP_REFERER
Адрес страницы (если есть), которая привела браузер пользователя на эту страницу. Этот заголовок устанавливается веб-браузером пользователя. Не все браузеры устанавливают его и некоторые в качестве дополнительной возможности позволяют изменять содержимое заголовка HTTP_REFERER. Одним словом, в самом деле ему нельзя доверять.
См. sample2.php

$_GET

Ассоциативный массив параметров, переданных скрипту через URL.

				
echo $_GET["name"] // вывод одного из параметров 
				
			
См. sample3.php

$_POST

Ассоциативный массив данных, переданных скрипту через HTTP метод POST.

				
echo $_POST["name"] // вывод одного из параметров 
				
			
См. sample4.php

$_FILES

Ассоциативный массив (array) элементов, загруженных в текущий скрипт через метод HTTP POST.

Загрузка файлов методом POST

Страница для загрузки файлов может быть реализована при помощи специальной формы, которая выглядит примерно так:

					
<form action="nameScript.php" method="POST" enctype="multipart/form-data" >
	<input name="userfile" type="file">
	<input type="submit">
</form>
					
				
Следует убедиться, что в атрибутах формы вы указали enctype="multipart/form-data", в противном случае загрузка файлов на сервер выполняться не будет.

$_FILES содержит всю информацию о загруженных файлах. Обратите внимание, что здесь предполагается использование имени userfile для поля выбора файла, как и в приведенном выше примере. На самом деле имя поля может быть любым.

$_FILES['userfile']['name']
Оригинальное имя файла на компьютере клиента.
$_FILES['userfile']['type']
Mime-тип файла, в случае, если браузер предоставил такую информацию. Пример: "image/gif". Этот mime-тип не проверяется в PHP, так что не полагайтесь на его значение без проверки.
$_FILES['userfile']['size']
Размер в байтах принятого файла.
$_FILES['userfile']['tmp_name']
Временное имя, с которым принятый файл был сохранен на сервере.
$_FILES['userfile']['error']
Код ошибки, которая может возникнуть при загрузке файла.

По умолчанию принятые файлы сохраняются на сервере в стандартной временной папке.

Для перемещения загруженого файла в новое место используется функция move_uploaded_file().

					
bool move_uploaded_file ( string $filename , string $destination );
					
				

Эта функция проверяет, является ли файл filename загруженным на сервер (переданным по протоколу HTTP POST). Если файл действительно загружен на сервер, он будет перемещён в место, указанное в аргументе destination.

См. sample5-7.html

$_COOKIE

Ассоциативный массив (array) значений, переданных скрипту через HTTP cookies.

Cookies - это механизм хранения данных браузером удаленной машины для отслеживания или идентификации возвращающихся посетителей.

Для установки сookies используется функция setcookie(). Для этой функции можно указать шесть параметров, один из которых является обязательным:

См. sample8-11.html

$_SESSION

Ассоциативный массив, содержащий переменные сессии, которые доступны для текущего скрипта.

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

Поддержка сессий в PHP заключается в способе сохранения некоторых данных между несколькими последовательными доступами к веб-сайту.

$_REQUEST

Ассоциативный массив (array), который по умолчанию содержит данные переменных $_GET, $_POST и $_COOKIE.

$_ENV

Ассоциативный массив (array) значений, переданных скрипту через переменные окружения.

Эти значения импортируются в глобальное пространство имен PHP из системных переменных окружения, в котором запущен парсер PHP. Большинство значений передаётся из командной оболочки, под которой PHP запущен, и различных системных приложений, полного и точного списка не существует. Пожалуйста, изучите документацию к вашей командной оболочке для получения списка переменных окружения.

Не много о HTTP методах GET/POST

Интернет - всемирная система объединённых компьютерных сетей для хранения и передачи информации(сеть сетей).

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

По стандарту, каждый компьютер, находящийся в Глобальной сети, имеет свой уникальный адрес - IP-адрес. IP-адрес представляет собой последовательность четырех чисел в диапазоне от 0 до 255, разделенных между собой точками.

		92.166.31.18
		192.168.0.1
			

Один компьютер может связаться с другим компьютером в сети, зная его IP-адрес. Но сказать "компьютер связался с компьютером" не совсем верно, так как связываются не сами компьютеры, а сетевые службы (программы), выполняющиеся на них.

Допустим, мы отправляем письмо по электронной почте, при этом наша почтовая программа связывается с почтовым сервером для отправки письма.

На компьютере одновременно может работать несколько сетевых программ, поэтому помимо IP-адреса для связи в стеки протоколов TCP/IP предусмотрено дополнительно такое понятие как порт.

Порт - это число в диапазоне от 1 до 65536. Таким образом, минимальным условием для связи одной сетевой программы с другой является наличие у первой IP-адреса и номера порта второй. Совокупность IP-адреса и порта принято записывать через двоеточие.

	92.166.31.18:8080
	192.168.0.1:443
			

Для установления связи первой программе задается номер порта и она начинает "ожидать" подключение второй. Второй программе указывается тот же самый номер порта и IP-адрес компьютера, на котором запущена первая программа. Это своего рода связь звонок по сотовому телефону, где номер телефона это совокупность IP-адреса и порта.

Программа, ожидающая подключение, называется сервером. Серверу при запуске указывается номер порта, часто говорят: "сервер слушает порт". На компьютере не может быть запущено более одного сервера с одинаковым номером порта, иначе невозможно определить, к какому из серверов подключаться. Программа, устанавливающая соединение с сервером, называется клиентом. На клиентов не распространяется подобное ограничение. К примеру, по этому на клиенте можно запустить более одного IRC-клиента. Также к серверу могут подключаться несколько клиентов с разных компьютеров, если это конечно поддерживает сам сервер.

Веб-сервер - это сетевая программа, ожидающая и принимающая запросы от клиентов и выдающий им HTTP-ответы, как правило, вместе с HTML-страницей, изображением, файлами, медиа-потоком или другими данными. По умолчанию, веб-сервер "слушает" порт под номером 80. Клиентом для веб-сервера выступает веб-браузер.

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

	yandex.ru
	vk.com
			

Доменные имена более понятны и более легки в запоминании. Однако, протокол TCP/IP не в состоянии найти требуемый компьютер по доменному имени, поэтому его необходимо преобразовать в IP-адрес. Для этого служат DNS-сервера, на которых расположены таблицы соответствий доменных имен и IP-адресов. Допустим, когда мы вводим в адресной строке браузера домен yandex.ru, в первую очередь посылается запрос на DNS-сервер для определения IP-адреса данного домена. Когда адрес определен, браузер пытается связаться с веб-сервером по этому адресу и стандартному порту 80. Если соединение с веб-сервером установлено, браузер запрашивает у веб-сервера требуемую страницу сайта.

Расположение корневых DNS-серверов
В принципе, веб-сервер можно настроить на работу и на другом порту, в таком случае в браузере при запросе страницы необходимо его указывать через двоеточие после доменного имени (например, site.ru:8080).

Каким же образом происходит запрос страницы сайта у веб-сервера? Для взаимодействия веб-сервера и браузера существует "общий язык", то есть стандарт, по которому формируются запросы и ответы. Этим стандартом служит протокол HTTP (HyperText Transfer Protocol).

HTTP

Стандарт RFC2616 Hypertext Transfer Protocol HTTP/1.1

Стандарт RFC7540 Hypertext Transfer Protocol Version 2 (HTTP/2)

HTTP ( HyperText Transfer Protocol - «протокол передачи гипертекста») - протокол прикладного уровня передачи данных (изначально - в виде гипертекстовых документов в формате HTML, в настоящий момент используется для передачи произвольных данных). Основой HTTP является технология клиент-сервер.

Когда вы заходите в браузер и вводите в адресную строку адрес к сайту, то браузер автоматически прибавляет к адресу приставку «http://». Единственное, эта приставка может быть по умолчанию скрыта, но если скопировать адрес и вставить его в другое место, то ее без труда можно будет увидеть. Эта приставка обозначает, что вы будете обращаться к ресурсу по протоколу HTTP.

Этот протокол соответствует схеме "запрос-ответ".На каждый HTTP-запрос браузера веб-сервер отвечает HTTP-ответом. По своей инициативе веб-сервер HTTP-пакеты не шлет, к тому же, зачастую, после завершения операции "запрос-ответ" сервер разрывает соединение с клиентом.

Схема запрос-ответ

Общение между хостом и клиентом происходит в два этапа: запрос и ответ. Клиент формирует HTTP запрос, в ответ на который сервер даёт ответ (сообщение).

По сути, протокол HTTP - это инструмент, с помощью которого можно передавать веб-страницы в сети Интернет. Веб-страница, которую мы получаем в ответе от сервера, на самом деле это HTML-код, который получает браузер и соответствующим образом его интерпретирует.

HTTP-сообщения

Каждое HTTP-сообщение состоит из трёх частей, которые передаются в указанном порядке:

Заголовки и тело сообщения могут отсутствовать, но стартовая строка является обязательным элементом, так как указывает на тип запроса/ответа.
Для версии протокола 1.1, сообщение запроса обязательно должно содержать заголовок Host.
HTTP-сообщения

Стартовая строка

Стартовые строки различаются для запроса и ответа. Строка запроса выглядит следующим образом

    METHOD URI HTTP/VERSION
			

Метод(METHOD)- это тип запроса, одно слово заглавными буквами.

URI определяет путь к запрашиваемому документу.

Версия протокола(VERSION) - определяет, в соответствии с какой версией стандарта HTTP составлен запрос(на данный момент актуальная версия 1.1 и по степенно уже внедряется HTTP/2).

Для того, чтобы обратиться к веб-странице по определённому адресу (в данном случае путь к ресурсу — это «/»), нам следует отправить следующий запрос:

    GET / HTTP/1.1
    Host: ya.ru
	
    GET /img/adqfcd12.txt HTTP/1.1
    Host: filehost.ru
			

Стартовая строка ответа сервера имеет следующий формат

    HTTP/Версия КодСостояния Пояснение 
			

Версия протокола - определяет, в соответствии с какой версией стандарта HTTP отправлен ответ(такая же версия как и в запросе).

Код состояния(Status Code) - три цифры (первая из которых указывает на класс состояния), которые определяют результат совершения запроса.

Пояснение к коду состояния(Reason Phrase) - текстовое пояснение к коду ответа, предназначено для упрощения чтения ответа человеком. Пояснение может не учитываться клиентским программным обеспечением, а также может отличаться от стандартного в некоторых реализациях серверного ПО.

    HTTP/1.1 200 ОК
    Server: nginx/1.2.1
    Date: Sat, 08 Mar 2014 22:53:46 GMT
    ....
			

Методы

Метод HTTP - это последовательность символов, указывающая на основную операцию над ресурсом. Обычно метод представляет собой короткое английское слово, записанное заглавными буквами. Обратите внимание, что название метода чувствительно к регистру.

Наиболее часто используются методы GET и POST

Обратите внимание на тот факт, что спецификация HTTP не обязывает сервер понимать все методы (которых на самом деле гораздо больше, чем 4) — обязателен только GET, а также не указывает серверу, что он должен делать при получении запроса с тем или иным методом.

GET

Запросы GET соблюдают идепотентность(тождественность). Состояние сервера и данные для приложения не должны измениться под воздействием запроса GET. Один и тоже GET запрос, выполняясь снова и снова, должен возвращать в точности те же самые результаты(предполагается, что в это время не происходит ничего друго, что привело бы к изменению состояния сервера).

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

HTTP-запрос типа GET состоит только из HTTP-заголовков, тело у него отсутствует.

При помощи GET-запроса можно передать веб-серверу параметры - некоторую информацию. Например, если необходимо осуществить поиск по определённым имени, то с помощью параметров можно передавать имя веб-серверу.

Клиент может передавать параметры выполнения запроса в URI целевого ресурса после символа ?(знак вопроса)

Пример из адресной строки браузера
    GET /path/resource?param1=value1&param2=value2 HTTP/1.1
    Host: host.local
				

Основным преимуществом GET-параметров является их размещение непосредственно в URL, что дает возможность сформировать гиперссылку на документ с определенными параметрами.

Стоит помнить так же и о длине URL. Она ограничена 1024 символами, это является ограничением для данных, которые можно отослать GET запросом

POST

Запросы POST могут быть неидемпотентными(нетождественными). Данные, передаваемые серверу в таких запросах, могут использоваться для изменения состояния приложения, например, для добавления записей в базу данных.

Основное предназначение POST запроса - это создания нового ресурса. POST запрос обычно содержит в себе всю нужную информацию для создания нового ресурса.

POST передает данные, используя тело HTTP запроса, в отличии от GET, который может передавать данные используя URI.

POST может отправлять гораздо большие объемы данных, чем GET запрос. Лимит устанавливается веб-сервером и обычно он колеблется в диапазоне от 2MB до 5MB(это ограничение только на размер одного запроса).

Передача данных методом POST более безопасна, чем методом GET, так как секретные данные (например пароль) не отображаются напрямую пользователю (в отличии от URI, который виден почти всегда).

Коды состояния

Код состояния является частью первой строки ответа сервера. Он представляет собой целое число из трёх цифр. Первая цифра указывает на класс состояния. За кодом ответа обычно следует отделённая пробелом поясняющая фраза на английском языке, которая разъясняет человеку причину именно такого ответа.

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

Выделено пять классов кодов состояния.