От автора: В этой статье мы поговорим о сессиях в PHP. Т.к. протокол HTTP не поддерживает сохранение данных между двумя разными транзакциями, были придуманы сессии.
Это очень упрощает работу, как программистам, так и пользователям. Например, сессии используются после авторизации пользователя на сайте: держат в памяти сервера данные о том, что пользователь был авторизован, и что теперь ему можно дать некоторые права администрирования или использования сайта (комментирование, просмотр закрытых для гостей страниц или же написание-редактирование-удаление новостей на сайте, etc.).
Сессии в PHP используются там, где нужно удержать данные о пользователе между транзакциями. То есть, каждый новый запрос выполняется как новый, без всякой связи с предыдущим, и вот как раз сессия играет роль недостающего звена, которое бы связало эти два запроса.
Так же сессии играют некую роль секьюрити. Как это понимать и что это за трактование? А понять просто, это банальная защита интерактивных частей сайта от нежелательной информации (то есть спама).
Перед изучением урока, я рекомендую скачать исходник себе на компьютер!

Как создать сайт самому?
Какие технологии и знания необходимы сегодня, чтобы создавать сайты самостоятельно? Узнайте на интенсиве!
ЗарегистрироватьсяКак работают сессии PHP?
Первым делом идентифицируется браузер. Ему выдается уникальный идентификатор, который будет передаваться при каждом запросе.
Идентификатор – это обычная переменная с неким значением. По умолчанию её имя PHPSESSID.
И цель PHP заключается в том, чтобы передать (двумя способами) эту переменную браузеру, чтобы тот, в свою очередь, вернул её со следующим запросом.
Грубо говоря, на сервере создается файл со всеми переменными для созданной сессии (+устанавливается период жизни сессии). И при открытии сессии в каком-то PHP файле, то сразу же идет запрос о получении id с cookies (см. выше — PHPSESSID), если нет таковой cookie с именем PHPSESSID , то создается новая сессия. Ну а если есть PHPSESSID, то с сервера загружается все связанное с предыдущей сессией. (Например, зарегистрированные переменные сессии).
Способы передачи значение переменной PHPSESSID
Через Cookies
Через URL
Кратко о способах
В браузер записывается cookie с именем PHPSESSID, естественно, если пользователь разрешил записывать их у себя в браузере. Подробнее о cookies можно почитать здесь, на этом сайте.
Через URL – PHP дописывает к каждой ссылке передачу id сессии (как для меня, это не очень удобно).
Итог: Кроме разрешения пользователя на использование cookie при передаче id сессии, можно так же задавать разрешение для PHP в файле php.ini для таких вот строк:
session.use_cookies = (1 – разрешить cookies, 0 — запретить)
session.use_trans_sid = (1 – разрешить передачу id сессии через url, 0 — запретить)
А вот и скриншот того, как должен выглядеть cookie PHPSESSID в браузере
Комментарий к скриншоту: как вы видите, я имею cookie PHPSESSID для домена sessions.gromitsu. Как я это получил? Все просто. Я создал файл index.php в корне домена sessions.gromitsu и открыл-закрыл в нем сессию.
1 2 3 4 5 | <?php session_start(); session_unset(); session_destroy(); ?> |
Установка (открытие) сессии PHP
Открытие сессии PHP производится при помощи функции session_start(), которая (ВНИМАНИЕ!) вызывается в самом начале php файла. Иначе вылезет ошибка (см. ниже).
1 | session_start(); |
Эта функция проверяет, существует ли PHPSESSID (или в cookies, или в ссылке (метод GET или POST)). Если да, загружает зарегистрированные переменные сессии, если нет, то создает новую сессию.
Регистрация переменных и удаление сессии
Регистрация переменных сессии.
Существует суперглобальный массив $_SESSION, который содержит в себе все сохраненные данные на протяжении всей сессии. Оперировать этим суперглобальным массивом так же просто, как и с простым.
1 2 | $_SESSION[‘yourname’] = "Vasya"; // сохраняем имя Вася в суперглобальный массив $_SESSION. Вместо yourname может быть что угодно. |
Вывод определенных данных с $_SESSION

Как создать сайт самому?
Какие технологии и знания необходимы сегодня, чтобы создавать сайты самостоятельно? Узнайте на интенсиве!
Зарегистрироваться 1 | echo $_SESSION[‘yourname’]; //выведет Vasya |
Ещё добавлю, что регистрировать переменные можно, как и массивы. О чем я? Смотрите ниже.
1 2 3 4 5 | <?php session_start(); $_SESSION['somearray'] = array('hello','world'); // echo $_SESSION['somearray'][0]; ?> |
Закрытие сессии
Закрытие сессии производится, как вы уже видели, при помощи функций session_unset() (освобождение всех переменных сессии от значений) и session_destroy() (закрытие сессии).
Разработаем простой скрипт инициализации имени пользователя на одной странице, удаление сессии и вывода приветствия с именем этого пользователя на другой странице.
pageone.php
1 2 3 4 5 | <?php session_start(); // Отрываем сессию $_SESSION['user'] = 'Вася'; // регистрируем переменную user через суперглобальный массив $SESSION со значением "Вася" ?> <a href="pagetwo.php">Перейти на вторую страницу</a> |
pagetwo.php
1 2 3 4 5 | <?php session_start(); // Стартуем сессию. echo "Приветствую вас, ".$_SESSION['user']; //Выведем имя пользователя через суперглобальный массив $_SESSION session_destroy(); //уничтожим все данные, хранящейся в суперглобальном массиве $_SESSION ?> |
Ну и страница, до которой данные сессии не сохранились. Сценарий такой же как и в pagetwo.php
pagethree.php
1 2 3 4 | <?php session_start(); // Для работы с сессиями, их нужно сначала запустить (открыть, стартонуть) echo "Приветствую вас, ".$_SESSION['user']; //Выведем имя пользователя через суперглобальный массив $_SESSION ?> |
Напоследок поговорим о ЕРРОРАХ, которые могут возникнуть в процессе обучения.
Warning: Cannot send session cookie — headers already sent
Warning: Cannot send session cache limiter — headers already sent
Эти ERRORS говорят о том, что ещё до использования функции session_start() был передан хоть один HTTP заголовок. Что это? При общении сервера и браузера сначала идет запрос на сервер, откуда потом сначала возвращается HTTP заголовок, а потом вся информация, которую вы запрашивали. Так вот, в PHP для удобства придумали так, чтобы функции header(), set_cookie(), session_start() передавали сами HTTP заголовки. И вот, неопытный программист, ещё до выполнения одной из выше написанных функций, имел неосторожность поставить лишний символ (пробел, цифру, букву). Так вот, до функций header(), set_cookie(), session_start() не должно стоять никакого символа. Абсолютно никакого! Тогда все будет работать на УРА!
На этом, урок по работе с сессиями в PHP, окончен. Буду рад Вашим комментариям и вопросам.
С уважением, Влад Паук.
Автор: Влад Паук
Редакция: Рог Виктор и Андрей Бернацкий. Команда webformyself.
E-mail: contact@webformyself.com
Проект webformyself.com — Как создать свой сайт. Основы самостоятельного сайтостроения
"Киберсант-вебмастер" — самый полный курс по сайтостроению в рунете!
P.S. Хотите опубликовать интересный тематический материал и заработать? Если ответ «Да», то жмите сюда.

Как создать сайт самому?
Какие технологии и знания необходимы сегодня, чтобы создавать сайты самостоятельно? Узнайте на интенсиве!
Зарегистрироваться
Разработка веб-приложения на PHP
Создайте веб-приложение на PHP на примере приема платежей на сайте
Смотреть
Привет из Ташкента! Спасибо за статью.
Проще некуда
Я очень хочу этот курс посмотреть, но напряг в связи с отсутствием на данный момент денег.
Скажите стоимость комплекта и можно ли будет его получить с отсрочкой платежа???
Без обид…
Подпись — Алексей Евгеньевич…
Урок получилось отлично.
Думаю каждый занимающий PHP программированием знает о необхадимости сессий. Полезный урок. Спасибо за Ваш труд.
Спасибо за статью.
Если можно скажите разницу между session_unset() и unset($_SESSION['something']), ведь обе уничтожают переменную, какое лучше использовать?
Хороший вопрос. Лучше все использовать второй вариант. Если быть точнее, безопаснее.
Спасибо вам за комментарий.
Андрей, Влад и Виктор здравствуйте!!! Вначале Спасибо большое за ваши уроки и за ваше отзывчивое сердце. Пробовал самостоятельно раньшеизучать и PhP и CSS и всё что связано с программированием, но для этого нужны мозги помоложе чем мои, а вот с вашей помощью и вашими уроками намноговсё стало яснее и понятнее, за что и я и все кто у вас учится благодарны за вашу помощь в постижении этой части науки о программировании. Поздравляю вас С Наступающим Новым Годом !!! Пусть в последующих годах вашей жизни всегда вам будет Удача и Успех во всём. С искренним уважением Николай Пахомов 69 лет.
Спасибо огромное!
Спасибо за поздравление!
Здравствуйте Влад!
У меня к вам такой вопрос:
Я впервые столкнулся с вопросом как привести к валидности свои страницы.
Как исправлять ошибки,чтоб на выходе получалась целиком валидная страница?
Я конечно не Влад и может быть не в теме вопроса, но что значит как?http://translate.google.com/ ). В некоторых случаях даже пишет «How to fix» — «как исправить». Плюс к этому пишет в какой строке ошибка. Собственно берете и правите.
Вам высветил валидатор — 612 Errors, 3 warning(s) — 612 ошибок и 3 предупреждения. Далее каждая ошибка разбирается и поясняется что не так. Если на английском не читаете, то нужно посидеть со словарем ( могу посоветовать
Например на 2-ую строку ругается потому что у вас идет , а доктайп указан < !DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">. Соответственно решение:
1. Или убрать строку ;
2. Или доктайп сделать таким — < !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
Причем второй вариант предпочтительнее.
Потом нужно будет поправить все теги мета. Ну и так далее.
P.S. Был бы вопрос конкретный, так и ответ бы дал конкретный (например написано правильно, но все равно выдает ошибку). А на абстрактный вопрос «А как?» и ответ такой же — «А вот так…»
Не чем ответить Андрей на удаленный комментарий?
Не знаете ответа или исправлять косяки просто влом?
В чем именно у Вас проблема?
Я уже писал в чем проблема Виктор.
Просто Андрей тут любит модерировать по чем зря.
И вносить сумятицу в голову коллег.
Чуть ниже отписал о чем..
Спасибо за отклик.
По-моему скромному мнению сумятицу вводите Вы. Только без обид.
Андрей отвечает на все направленные вопросы ему на email. ГАРАНТИРОВАНО. И судя по откликов многих, отвечает он качественно, поэтому обвинение его в некомпетентности, по меньшей мере не обосновано.
…ИМХО.
Андрей вообще к модерации комментариев отношения не имеет — если что))
По поводу — «Не чем ответить Андрей на удаленный комментарий?»
— Я считаю, что я рассказал вам, как действовать в данной ситуации. Даже для примера первую ошибку разобрал.
По поводу — «Не знаете ответа или исправлять косяки просто влом?»
— За вас исправлять 613 ошибок, копаясь в чужом коде, у меня просто нет времени. Мне еще и на мыло письма приходят, и поддерживать клиентов, купивших курс тоже нужно. А забить на них всех и сесть на день разбираться с вашим кодом… Ну извините…
А по поводу — «Не знаете ответа?»
— Там ответ сам валидатор пишет, только на английском. — Может Вам влом со словарем посидеть? Плюс вам же пользы от этого больше будет. Сами разберетесь и больше таких ошибок клепать не будете. Ну а если в чем-то конкретно засада будет, пожалуйста, — Вопрос в студию. Помогу.
Андрей вы извините,но вы сами вносите сумятицу в ответе мне.
и людей впросак вводите..
Где мой второй комментарий на ваш первый отклик?
Кто его модерировал и и не стал показывать на общее обозрение?
А ведь я там ясно изложил свою мысль..
И что касается моего второго комментария,то оно уже касалось именно по второму моему комментарию.
И если вкратце ,то повторю еще раз:
Сайт не мой,его клепал горе программист.
Просто по работе досталось править за ним ошибки.
Наткнувшись на ваш сайт,решил спросить у коллег как править ошибки в php,
и править не просто так, а еще приводить их к валидности.
И пример мне нужен лишь единичный, а не править все косяки.
И в качестве примера просил вас показать это на любой вашей странице,
которые тоже валидным идеалом не блещут,вплоть до CSS
Опыт работы с ошибками в HTML у меня на отлично,примеры я уже давал.
И с английским о,кей
Так что мне нужен лишь малость — показать это на своем примере, как вы их исправлять будете.
Но,а если не знаете как, так и скажите — не можем мол брат, не можем..
И давайте не резать комментарии
Ведь это легче всего -удалить то..
Как говорил выше, комментарии я не модерирую. Не знаю куда он делся. Хотя модерируются все комментарии — и хорошие и плохие, тем более если это вопрос. Так что возможно он просто не дошел до сайта.
И так, как это делать.
Я понимаю, что идет часть PHP кода, в нем всавки html. Но в этом коде нужно найти то место, на которое ругается валидатор и подправить. Найти можно обычным поиском аля «Правка» -> «Найти» — это в любом редакторе кода есть.
То что касается пропущенного атрибута alt в теге img или неправильного закрытия тега img — то это прямо из админки в редакторе статьи делать придется
Пробежалась по статье, вот думаю – изучать или нет PHP. Сейчас у меня блог php не поддерживает. А завтра. Хорошо, что есть места где об этом можно почитать
Спасибо за статью! Все понятно написано, очень интересно и тема актуальная! А можно узнать, а в курсе ДВД есть такой материал?
Да, конечно есть!
огромное спасибо за познавательную статью!
Спасибо,друзья! Но мне этот интересный материал не осилить.
Осилить! Главное очень захотеть.
я довольно таки недавно начал учить PHP, имеется вопрос.
если сохранить в суперглобальный массив какую либо информацию, сохранится ли она до следующего открытия браузера (ну конечно если не стоит очистка) ???
буду благодарен за ответ.
Сессии эт прикольно , но вот недавно была проблема .
Делал в админке сайта аякс запрос к пхп файлу ( скрипт обрабатываться может секунд 20-40), так вот в это время хотел еще делать еще 1 аякс запрос к другому скрипту, но не работало . Оказалось так как я использую сессии в первом скрипте и во втором, первый блочил запись файла сессии ,а второй скрипт так как файл заблокирован ждал пока обработается первый
Хорошая статья, всё доходчиво и понятно. Респект.
Очень полезная статья. Всё очень понятно. Спасибо!!!
Мне, как начинающему, статья действительно полезна. Хочу реализовать расширенную форму комментариев на Вордпресс, это как раз то что мне нужно
Здорово, но непонятно. Нужно наверное первые уроки почитать.
Толково написано!
У меня была ошибка сессии при перезде на новый хостинг.
Несколько раз вызывалась session_start()
Для избежания этой проблемы помогло проверка наличия сессии