Базовый курс подготовки web-программиста на PHP.

 

Введение

Время чтения курса без практических занятий — 815 минут. Практические занятия включают в себя разбор котрольных заданий в объёме 540 минут (по часу на каждую главу курса).

Цели и задачи курса

Начальные навыки.

Для успешного прохождения курса слушатель должен иметь следующие навыки

  • Базовые навыки html-верстки;
  • Навыки программирования на любом ЯП.
  • Навык установки web-сервера с интерпретатором php

Основные принципы работы web-сервера

URL и его структура

Рассмотрим типичный пример адресной строки браузера.

Адресная строка браузера

Адресная строка браузера

Протокол

Протокол — набор правил обмена сообщений. http — один из протоколов для передачи данных по сети. Так же можно вспомнить: ftp, https, smb, и даже такие экзотические, как obex и svn. http — специализируется на передаче гипертекстовых документов (web-страниц).

Хост(HTTP_HOST, HOST, Имя домена)

Хост определяет к какому сайту направлен наш http — запрос. Хост выполняет двойную роль(направляется запрос к DNS-серверу):

  1. Является указателем на конкретный компьютер в сети, на котором устанавлен web-сервер
  2. Является указателем на виртуальный хост на web-сервере, из которого берутся данные.
Понятие виртуального хоста.

Виртуалхост — запись в настройках web-сервера, определяющая из какого корневого каталога для какого хоста, прописанного вURL, отдавать данные.

Корневой каталог(DOCUMENT_ROOT) — каталог, начиная с которого клиенту отдаётся содержимое документов, находящихся в нём. То есть доступ к подкаталогам DOCUMENT_ROOT возможен, к надкаталогам — нет.

Рассмотрим последовательность совершения браузером запроса к web — серверу.

Схема работы виртуальных хостов веб-сервера

Схема работы виртуальных хостов веб-сервера

  1. Получение IP-адреса web-сервера. Согласно настройкам операционной системы идёт обращение к DNS: передаётся имя домена, и получается IP адрес
  2. Получение содержимого web-страницы. Браузер подключается к web-серверу, используя полученный от DNS IP-адрес, передаёт имя домена(HOST) и запрос документа(REQUEST_URI) и получает его содержимое.

Часто встречающиеся ситуации, когда IP-адрес web-сервера получить не удаётся:

  • DNS работает неверно;
  • DNS недоступен;
  • доменное имя незарегистрировано;
  • настройки файрвола не позволяют получить IP;

В данном случае ОС просто не знает под каким IP-адресом web-сервер подключен к сети, и браузер никуда не может послать имя домена и запрос документа(REQUEST_URI). В этом случае можно прямо указать какой к какому серверу необходимо подключиться (все браузеры имеют настройку «использовать прокси-сервер»), указав IP и порт(как правило это порт 80).

Как проверить доступность DNS и web-сервера.

Для проверки доступности, и просмотра вывода, DNS — сервера используется команда nslookup.

Пуск->Выполнить->nslookup [имя домена]

Ответ DNS-сервера, если он доступен, выглядит так:

nslookup perpetum-mobile.ru
Server:         62.213.0.12
Address:        62.213.0.12#53

Non-authoritative answer:
Name:   perpetum-mobile.ru
Address: 81.177.46.165

Разберём вывод nsloockup:

  • Server: 62.213.0.12 — IP- адрес DNS, который нам ответил
  • Address: 62.213.0.12#53 — полный адрес DNS (вместе с портом) который нам ответил
  • Name: perpetum-mobile.ru — имя домена, запрос на выдачу IP которого был отправлен
  • Address: 81.177.46.165 — IP адрес web-сервера, на котором располагается сайт perpetum-mobile.ru
Проверка web-сервера

Для проверки физической доступности web-сервера можно использовать команду telnet.

Пуск->Выполнить->nslookup [IP адрес или имя домена] [порт]

Как правило, web-сервер работает на порту 80.

Разберём вывод команды telnet

telnet perpetum-mobile.ru 80
Trying 81.177.46.165...
Connected to perpetum-mobile.ru (81.177.46.165).
Escape character is '^]'.
  • Trying 81.177.46.165 — «пытаюсь соединиться» если в качестве аргумента команды telnet вы ввели имя домена, а не IP адрес, но при этом этой строчки не появилось — это причина задуматься о том, что DNS по какой-то причине недоступен. Вывод DNS обычно кэшируется ОС.
  • Connected to perpetum-mobile.ru (81.177.46.165) соединено с web-сервером, если этой строчки так и не появилось, но появилась предыдущая — очень вероятно, что запрашиваемый север недоступен.
  • Escape character is ’]’. — приглашение на ввод.

REQUEST_URI

REQUEST_URI — запрос документа у web-сервера. Если HTTP_HOST определяет из какого корневого каталога будет получен документ, то REQUEST_URI определяет:

  • путь этого документа относительно корня (SCRIPT_NAME);
  • дополнительные параметры вызова (QUERY_STRING).

REQUEST_URI может содержать только следующие символы:

  • символы латинского алфавита;
  • следующие знаки препинания:
    • -(тире),
    • .(точка), _(нижнее подчеркивание),
    • %(процент), ?(знак вопроса)
    • , =(равно), &(амперсант);
    • любые другие символы ASCII двухбайтные символы Unicode, где каждый байт кодируется через %[HEX-код];

SCRIPT_NAME. Mime-types

Mime-type — тип документа, определяемый по расширению. К типу может быть привязано какое-то действие, но по умолчанию web-сервер просто передаёт содержимое документа web-клиенту(браузеру), но может быть и какая-то обработка. Примеры mime-types:

  • text/plain — простой текст;
  • text/html — html документ;
  • image/png — изображение в формате PNG

QUERY_STRING

QUERY_STRING — дополнительные параметры документа. Имеет вид пар «ключ=значение». Пары отделяются друг от друга амперсантами &. Ключ от значения отделяется знаком «равно». Отделяется от SCRIPT_NAME знаком вопроса.

http-протокол

HTTP — протокол — описания порядка обмена служебной информацией (заголовками) данными. Наблюдать какая служебная информация в виде заголовков передаётся от браузера web-серверу и обратно можно, например, с помощью плагина к FireFox, который называется LiveHTTPHeader

http-заголовки в плагине LiveHTTPHeader для FireFox

http-заголовки в плагине LiveHTTPHeader для FireFox

Скачать его можно тут: http://livehttpheaders.mozdev.org/

Независимо от типа запроса сохраняется следующая последовательность:

  1. передача заголовков запроса
  2. передача заголовков ответа и блока данных(если они есть)

Заголовки запроса. Методы GET и POST.

Метод GET

При осуществлении запроса методом GET все параметры запроса к сайту (за исключением cookie) передаются через REQUEST_URI.

http-заголовки запроса GET

GET /project_checkout.php HTTP/1.1
Host: xepace.localhost
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US) Gecko/20070914 Firefox/2.0.0.9
Referer: http://xepace.localhost/

Основные элементы html-страницы, позволяющие делать GET-запросы

Гиперссылки

<a href="http://yandex.ru" title="Яндекс" target="_blank">
    Гиперссылка
</a>
Гиперссылка

Гиперссылка

Изображения

<img src="/images/crazytux.png" title="Бешенный пингвин1" border="2"
alt="Пингвин1"/>
<img src="/images/crazytux_.png" title="Бешенный пингвин2" border="2"
alt="Пингвин2"/>
Изображение в браузере

Изображение в браузере

Внешние таблицы стилей

<link href="css/style.css" rel="stylesheet" type="text/css" />

Внешние файлы с JavaScript

<script type="text/javascript" src="/scripts.js"></script>

Фреймы

<iframe src="/frame.php"></iframe>
Фрейм

Фрейм

Формы

<form action="" method="GET" target="_blank">
    <input type="text" name="textfield" value="textvalue"/><br/>
    <label>
        <input type="checkbox" name="checkbox" checked/>Checked
    </label><br/>
    <label>
        <input type="radio" name="radio" value="radio1" />radio-one
    </label><br/>
    <label>
        <input type="radio" name="radio" value="radio2" selected/>radio-two
    </label><br/>
    <input type="submit" name="get" value="Отправить форму"/>
</form>

Данный html-код генерит страцичку следующего вида:

Форма

Форма

При отправке этой формы открывается новое окно, в которое загружается url:

http://xepace.localhost/images/index.html?textfield=textvalue&checkbox=o......
&radio=radio2&...
get=%D0%9E%D1%82%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D1%82%D1%8C+%D1%84%D0%BE%D1%80%D0%BC%D1%83
Метод POST

При осуществлении запроса методом POST кроме параметров, которые можно наблюдать в строке браузера, передаётся скрытая строка параметров

http-заголовки запроса POST

POST /images/index.html HTTP/1.1
Host: xepace.localhost
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US) Gecko/20070914 Firefox/2.0.0.9
Referer: http://xepace.localhost/
Content-Type: application/x-www-form-urlencoded
Content-Length: 40
pass=&hid=hidden_value&textarea1=textarea_value&post=POST_FORM

Основные элементы html-страницы, позволяющие делать POST-запросы

Формы

<form action="" method="POST" target="_blank">
    <input type="password" name="pass" value=""/><br/>
    <input type="hidden" name="hid" value="hidden_value"/>
    <textarea name="textarea1">textarea_value</textarea><br/>
    <input type="submit" name="get" value="Отправить POST форму"/>
</form>

В новую страницу будет загружен url

http://xepace.localhost/images/index.html

а в заголовках отправлены значения полей в виде

Прочие заголовки запроса

Заголовки ответа.

TTP/1.x 200 OK
Date: Tue, 24 Jun 2008 17:34:13 GMT
Server: Apache/2.2.6 (Mandriva Linux/PREFORK-8mdv2008.0)
X-Powered-By: PHP/5.2.6
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-Length: 5547
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=utf-8

Коды ответа.

200
HTTP/1.x 200 OK
Content-Type: text/html; charset=utf-8
500
HTTP/1.x 500 Internal Server Error
Content-Type: text/html; charset=iso-8859-1
403
HTTP/1.x 403 Forbidden
Content-Type: text/html; charset=iso-8859-1
404
HTTP/1.x 404 Not Found
Content-Type: text/html; charset=iso-8859-1
304
GET /main.css HTTP/1.1
Host: xepace.localhost
Referer: http://xepace.localhost/project_checkout.php
If-Modified-Since: Wed, 04 Jun 2008 09:25:46 GMT
HTTP/1.x 304 Not Modified
302
HTTP/1.x 302 Found
Location: 1.php
Content-Length: 0
Content-Type: text/html

Куки

Куки — информация, отсылаемая в заголовке ответа. Сохраняется в браузере, и передается в виде заголовка запроса, если

  1. время хранения не истекло;
  2. имя хоста к которому осуществляется запрос, совпадает с шаблоном в сохранённых куках;
  3. REQUEST_URI запроса к web-серверу содержит PATH, в куках;

Заголовок ответа, сохраняющий куки в браузере, выглядит так:

Set-Cookie: cookie1=qwerty; expires=Wed, 25-Jun-2008 22:49:28 GMT; path=/libs; domain=xepace.localhost

А это заголовок запроса, если хранящеся куки удовлетворяют необходимым условиям:

Cookie: cookie1=qwerty;

Сессии

У куков есть определенные проблемы с безопасностью, связанные с тем, что все значения передаются в http-заголовках напрямую. Для данных, которые нежелательны для раскрытия (к примеру можно было запоминать логин и пароль входа) лучше применять механизм сессии.

Сессия — набор данных, хранящихся в файле во временном каталоге или в оперативной памяти, содержащих информацию, характерную для определенного посетителя. Принадлежность данных к конкретному файлу определяется на основе куков — ID сессии. Значение этих куков, как правило, совпадают с именем файла сессии. Значение ID сессии так же можно передавать не через cookie, а в качестве одного из параметров QUERY_STRING. Если web-приложение, работающее с сессией написано на php, то это можно сделать через файл .htaccess.

Настройка параметров подкаталогов через .htaccess

Для отдельного каталога в виртуальном хосте и всех его подкаталогов можно определить собственные настройки web-сервера. Это делается с помощью файла .htaccess

Управление способом передачи ID сессии

Немного забегая вперёд, отметим, что для настройки PHP, работающего в окружении web-сервера, используются ключи конфигурационного файла php.ini. Некоторые из них можно задавать через .htaccess, в том числе и эти 3 ключа, управляющие способом передачи ID сессии.

  • session.use_cookies — использовать cookie для передачи ID сессии
  • session.use_only_cookies — использовать только cookie для передачи ID сессии
  • session.use_trans_sid — использовать QUERY_STRING для передачи ID сессии

Для того, чтобы ID сессии передавался только через cookie в .htaccess достаточно прописать следующее

php_flag session.use_cookies On
php_flag session.use_only_cookies On
php_value session.use_trans_sid 0

Кодировка по умолчанию

AddDefaultCharset utf-8
AddDefaultCharset windows-1251

Индекс каталога. Документ по умолчанию

Если REQUEST_URI не содержит не содержит имени конечного файла, а только имя каталога, то имя файла в каталоге, которое берётся по умолчанию прописывается в .htaccess директивой

DirectoryIndex index.html

Если необходимо не использовать файл по умолчанию, а вывести содержимое запрашиваемого каталога — используйте:

Options +Indexes
Страница индекса каталога

Страница индекса каталога

Разрешение и запрещение доступа

Запретить доступ для всех

Deny from all

Запретить доступ для 192.168.0.1 и 192.168.0.1

Deny from 192.168.0.1 192.168.0.1

Запретить доступ для всех кроме 192.168.0.1 и 192.168.0.1

Deny from all
Allow from 192.168.0.1 192.168.0.1

http-авторизация

Окно http-авторизации

Окно http-авторизации

Авторизация и аутентификация будут производиться при помощи двух файлов: .htaccess и .htpasswd . При помощи первого файла будет выдаваться форма запроса логина и пароля. Для этого в файл .htaccess следует добавить следующие строки:

AuthUserFile /home/user/public_html/.htpasswd
AuthName "example of http-auth"
AuthType Basic
Require valid-user admin

AuthUserFile — указывает на файл, в котором хранятся имена пользователей и пароли. Требуется указать полный путь. Стоит заметить, что файл с паролями следует размещать так, чтобы он не был доступен для просмотра из интернета. О том, что из себя представляет этот файл, будет сказано ниже.

AuthName — текст, заключенный в кавычках после этой директивы, будет выведен в окне запроса логина и пароля.

AuthType — тип авторизации. В данном случае используется тип Basic. Есть еще один — Digest. Разница заключается в том, что тип Basic хранит пароли зашифрованные алгоритмом DES, а Digest для этих целей использует MD5.

Require — определяет кому давать доступ. valid-user означает что доступ будет предоставлен тем кто введет правильно логин и пароль. Эту директиву можно настроить так чтобы она впускала только пользователей определенной группы или просто пользователей перечисленных после нее через пробел.

Для создания парольного файла нужно выполнить:

htpasswd -c .htpasswd admin

Где:

  • .htpasswd — имя парольного файла (можно не менять);
  • admin — логин доступа.
  • После этого в консоли вводится пароль и подтверждение пароля.

Парольный файлик — готов. Можно просто создать файл .htpasswd и ручками впечатать туда: yourname:yourpass (где: yourname — логин, yourpass — пароль), но это крайность, т.к. если твой сайт находится на общем хостинге, есть вероятность что другие пользователи хостинга будут мониторить логин:пароль.

Переопределение стандартных страниц ошибок

Переопределить стандартые страницы ошибок можно с помощью директивы

ErrorDocument

Например, чтобы для отображения 404-й ошибки использовалась страница с REQUEST_URI /errors/404.html достаточно прописать:

ErrorDocument 404 /errors/404.html

mod_rewrite

mod_rewrite — плагин к web-серверу apache, позволяющий налету подменять одни REQUEST_URI другими, с последющим редиректом или без.

Options +FollowSymLinks
RewriteEngine on

Это отдельная большая тема и тут рассматриваться не будет.

Синтаксис PHP, работающего в окружении web-сервера. Часть 1.

Структура скрипта. Формирование заголовков ответа.

Скрипт PHP — по сути является приложением, принимающим заголовки от браузера и формирующим заголовки ответа и содержимое. Создадим в DOCUMENT_ROOT web-сервера файл 0.php следующего содержания.

<html>
<head>
</head>
<body>
<h1>Test</h1>
<h2>
<?php
    $a = 1;
    $b = 2;
    $c = $a + $b;
    echo $c;
?>
</h2>
</body>
</html>

Заголовки, которые будут сформированиы этим скриптом будут выглядеть так:

HTTP/1.x 200 OK
Date: Sun, 06 Jul 2008 07:07:39 GMT
Server: Apache/2.2.6 (Mandriva Linux/PREFORK-8mdv2008.0)
X-Powered-By: PHP/5.2.6
Content-Length: 74
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html

В браузер будет передано следующее содержимое:

<html>
<head>
</head>
<body>
<h1>Test</h1>
<h2>
3
</h2>
</body>
</html>

Которое в окне браузера отобразится как заголовок первого уровня «Test» и заголовок 2-гоуровня «3».

Из приведённых примеров можно сделать следующие выводы:

  1. Содержимое файла с расширением .php не передаётся браузеру в неизменном виде, а обрабатывается интерпретатором PHP.
  2. Интерпретатор PHP по умолчанию формирует http-заголовки, показывающие, что содержимое страницы сгенерировано динамически и его следует отображать как html-страничку
  3. Всё содержимое файла с расширением .php передаётся браузеру без изменений, за исклученим блоков <?php … ?>, которые выполняются как программа, с возможностью вывода в виде html-кода

Есть возможность прописать собственные заголовки, для того, чтобы, например, содержимое генерируемой страницы отображалось не как html-страница, а как простой текст (без интерпретации тегов) (файл 1.php)

<?php header("Content-Type: text/plain");?>
<html>
<head>
</head>
<body>
<h1>Test</h1>
<h2>
<?php
    $a = 1;
    $b = 2;
    $c = $a + $b;
    echo $c;
?>
</h2>
</body>
</html>

Сгенерированная страничка выведется в виде простого текста.

<html>
<head>
</head>
<body>
<h1>Test</h1>
<h2>
3</h2>
</body>
</html>

Ещё пара выводов:

  1. В тексте .php — файла может быть произвольное число блоков <?php ?>, каждый из которы будет исполняться как программа.
  2. Поскольку заголовки всегда отправляются перед тем как содержимое, вызовы функции header должны осуществляться перед тем, как будет вывод ЛЮБОГО текста. Таже если будет пробел перед первым <?php — заголовок не будет отправлен, и вместо него будет передан заголовок по умолчанию (в данном случае «Content-type: text/html»)

Получение информации об установленном интерпретаторе PHP.

В PHP есть стандартная функция, которая выводит в виде красивого форматированного html-кода параметры установленного интерпретатора PHP. Разместим в файле 2.php следующий код.

<?php phpinfo();?>

Сгенерированный этой функцией код формирует страницу следующего вида:

Страница информации о текущей версии PHP

Страница информации о текущей версии PHP

Переменные. Фукции для работы с переменными. Присваивание.

Массивы. Фукции для работы с массивами. Присваивание. List

Служебные массивы как средство передачи параметров скрипту.

Синтаксис PHP, работающего в окружении web-сервера. Часть 2.

Условия.

Операторы сравнения. Арифметические операторы.

Циклы foreach, for, while. Операторы continue и break

Функции. Встроенные функции.

Операторы include и include_once.

Принцип разделения данных и формы.

Операции ввода-вывода в PHP.

Работа с файловой системой

Функции работы с каталогами. Чтение содержимого каталога

Функции работы с файлами. Получение информации о файлах. Права.

Чтения из файла и запись в файл.

Работа с удалёнными документами с помощью http-протокола.

Работа по http-протоколу c использованием библиотеки curl.

Работа c удалённым документом как с файлом.

Загрузка файлов на сервер.

Работа с датой и временем.

Работа со строками в PHP.

2 вида кавычек. Операция конкатенации(слияния).

Длина строки

Разбиение строки на части по разделителю. Слияние строки по разделителю.

Выделение подстрок и поиск по подстроке.

Регулярные выражения

Когда возникает необходимость в регулярных выражениях.

Классы символов.

Псевдонимы классов символов.

Повторители.

Группировка.

Модификаторы

Ограничения регулярных выражений. Многострочное сопоставление.

MySQL. Часть 1

Табличное представление данных. Типы данных в столбцах.

Понятие первичного ключа

Понятие справочной таблицы.

Понятие внешнего ключа

Понятия сервера БД. Привелегии. Подключение. Простейшие запросы.

Запрос на создание таблицы.

Запрос на вставку строки в таблицу.

Запрос на выборку из таблицы

Условие в запросе.

Запрос на изменение записи в таблице.

Запрос на удаление строки

Запрос на удаление таблицы.

Основные популярные инструменты для работы с MySQL

phpMyAdmin

Sypex Dumper

MySQL. Часть 2.

Индексы

Сортировка выборки.

Лимитированная выборка.

Группировка выборки. Групповые операции.

Сложные запросы

Запрос со связыванием основной таблицы со справочной.

Использование подзапросов

7.6 Работа с MySQL из PHP.

Подключение к БД и установление кодировки соединения.

Осуществление запросов.

Получение количества выбранных строк.

Получение количества изменённых строк.

Получение значения первичного ключа вставленной строки.

Получение результата запроса на выборку.

Примеры реализации простых web-приложений.

Авторизация

Форма обратной связи. Отправка почты.

Счетчик посетителей

Гостевая книга. C уведомлением по почте.

Вопрос-ответ

Новости

Статья и комментарии


Добавить комментарий