Основы PHP

Отличие веб приложения от обычной программы

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

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

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

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

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

Сессии

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

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

Задача PHP состоит в том, чтобы при каждом вызове session_start() записать идентификатор в куки браузера или передать через GET/POST, чтобы тот вернул ее со следующим запросом.

Идентификатор можно передать только двумя способами: в куках или POST/GET запросом.
В настройках php.ini можно их переключать:

session.use_cookies - если 1, то PHP передает идентификатор в куках

session.use_trans_sid - если 1, то PHP передает добавляя к URL и формам.

Если включена только первая, то при старте сессии клиенту устанавливается кука. Браузер исправно при каждом следующем запросе эту куку возвращает и PHP имеет идентификатор сессии.

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

<a href="/index.php?PHPSESSID=9ebca8bd62c8356es5tdf34f585ff8f">Index</a>

<form>
<input type="hidden" name="PHPSESSID" value="00196c1c1a02e4c37ac04f921f4a5eec" />
</form>

Область применения

Очень важно понимать, для чего сессии стоит использовать, а для чего - нет.

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

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

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

if (isset($_REQUEST[session_name()])) session_start();

Таким образом, мы стартуем сессию только тем, кто прислал идентификатор.

Следует помнить, что пхп лочит файл сессии. То есть, если один ваш скрипт стартует сессию и долго выполняется, а другой пытается в это время стартовать её с тем же идентификатором, то он зависнет. Поэтому в долго выполняющихся скриптах следует стартовать сессию только тогда, когда она нужна, и тут же закрывать её, с помощью session_write_close()

Абсолютные и относительные пути в файловой системе и на сайте

Сайты существуют как бы в двух измерениях: реальном и виртуальном.

Для всех посетителей - это виртуальный веб-сервер.Если ты пишешь http://yoursite.ru/file.html - это не файл. Это URI, виртуальный адрес. Никакого файла с именем file.html на сервере может вообще и не быть. Это все виртуальные адреса, а не файлы. И браузер работает именно с адресами.

Для разработчика же сайт - это программа, выполняющаяся на совершенно конкретном реальном компьютере.

Если путь указывается от корня системы, то это путь абсолютный. Примеры абсолютных путей:

/var/www/site/forum/index.php
/img/frame.gif
с:\windows\command.com

В Unix-системах и на веб сайтах корень обозначается косой чертой - "/".
В Windows системах файловая система разбивается по дискам, поэтому, в абсолютном адресе надо указывать имя диска. Абсолютного корня всей файловой системы в Windows нет, у каждого диска - свой. Например, C:\ E:\ поэтому, даже если путь в виндоус начинается с косой черты, то это не абсолютный путь, а относительный. А абсолютный начинается с буквы.

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

file.php (фал лежит в той же папке)
./file.php (фал лежит в той же папке, другой вид записи)
images/picture.jpg (файл лежит в капке images, которая находится в текущей)
../file.php (файл лежит в папке, которая расположена на один уровень выше от текущей)
../../file.php (файл лежит в папке, которая расположена на два уровня выше от текущей)

Когда мы переходим по адресу:
http://www.site.ru/user/index.php,
нам сервер может отдавать файл:
/var/www/site/user/index.php

Мы видим, что у них есть общая часть: /user/index.php, для браузера это полный путь от корня сайта, для серверного скрипта это лишь часть пути. Непересекающиеся части можно записать так:

http://www.site.ru/ --> /var/www/site/

Это можно описать так: Корнем сайта http://www.site.ru/ является директория на сервере: /var/www/site/ и этот же путь будет лежать в системной переменной: $_SERVER['DOCUMENT_ROOT']

Рекомендуется указывать пользоватся абсолютными путями на сайте:
http://www.site.ru/job/vacancy.php
или
/job/vacancy.php (ссылки на локальные адреса)

Вывод ошибок

ini_set('display_errors',1);
error_reporting(E_ALL);

register_globals

Всегда ставьте register_globals=off

На заметку

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

2. В релизной версии использовать trigger_error() вместо die(), а лучше использовать try catch.

3. Ко всем приложениям на сервере можно обращаться через функцию system().

if($a < 1){
    $name = 1;
} else {
    $name = 'anna';
}

комментарии (0)