<MyRusakov.ru />

Финансовая грамотность от А до Я

Финансовая грамотность от А до Я

Данный курс в кратчайшие сроки обучит Вас финансовой грамотности. Эти знания позволят Вам получить, как минимум, серьёзную финансовую стабильность, а, как максимум, финансовую независимость.

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

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

Подробнее
Подписка

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

YouTube Подписаться

Подписавшись по E-mail, Вы будете получать уведомления о новых статьях.

Подписка Подписаться

Добавляйтесь ко мне в друзья ВКонтакте! Отзывы о сайте и обо мне оставляйте в моей группе.

Мой аккаунт Мой аккаунт Моя группа
Опрос

Какая тема Вас интересует больше?

Сессии в PHP

Сессии в PHP

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

Давайте с Вами поработаем с сессиями в PHP. И начнём с функции session_start(). Данная функция делает следующее: если пользователь зашёл впервые, то создаёт уникальный идентификатор и записывает его в cookie, а также создаёт новый файл, вновь уникальный для пользователя. Если пользователь уже заходил, то тогда сервер считывает значение уникального идентификатора из cookie и, в соответствии с ним, обращается к нужному файлу сессии. Из этого файла PHP считывает все данные и помещает их в массив $_SESSION. Давайте напишем простой код, в котором мы записываем переменную в сессию, либо считываем, если она уже была записана.

<?php
  session_start();
  if (isset($_SESSION['name'])) $name = $_SESSION['name'];
  else $_SESSION['name'] = "15St";
  echo $name;
?>

Вначале мы вызываем функцию session_start(), которую я описал выше. Затем проверяем: существует ли переменная "name" в сессии. Если существует, то считываем из неё данные и записываем в переменную name. Если не существует (то есть пользователь пришёл в первый раз), то устанавливаем переменной "name" в сессии значение "15St.". Следующей строкой выводим значение переменной $name. Очевидно, что при первом запуске, Вы увидите пустую строку, а вот при втором увидите строку "15St.", считанную из сессии.

Советую Вам сейчас ввести в адресной строке: "javascript:document.cookie" (вводите на той же вкладке, что и запускали скрипт). В результате, Вы увидите примерно следующее: "PHPSESSID=f99c53cca398f756fa958e8cee2136bc". Как раз значение PHPSESSID и является тем самым уникальный идентификатором.

И чтобы всё стало совсем понятно, то советую даже найти файл сессии. Если Вы используете Denwer, то он лежит в папке "tmp". Посмотрите на файлы, которые начинаются на "sess_" - это и есть те самые файлы сессии. Вы можете их открыть в простом блокноте.

Ещё одно очень важное свойство - это временность сессий в PHP. То если cookie хранятся до тех пор, пока их не удалит браузер. А браузер их по умолчанию не удаляет никогда. То сессии хранятся время, заданное в настройках PHP. По умолчанию, это 15 минут. То есть если Вы будете использовать аутентификацию на основе сессии, то через 15 минут бездействия пользователя, ему снова придётся авторизоваться. Разумеется, это хорошо, так как если пользователь забудет "Выйти", то ничего плохого не случится. Злоумышленник не сможет воспользоваться аккаунтом пользователя. Более того, при использовании cookie их можно выкрасть, подставить в своём браузере, и в результате злоумышленник авторизован под чужими данными, не зная даже пароля. А сессию украсть не получится, так как все параметры хранятся на сервере, и узнать о них не получится.

Поэтому старайтесь в своей практике преимущественно использовать сессии, а не чистые cookie.

И, напоследок, хочется предупредить об очень частой ошибке. Никогда не выводите данные в браузеры до использования функции session_start(), иначе она выдаст ошибку. То есть нельзя писать вот так:

<?php
  echo "Hello";
  session_start();
?>

При запуске данного скрипта возникнет ошибка. То же самое правило действовало и с cookie (функция setcookie()). Так что, думаю, здесь всё понятно.

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

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

  1. Кнопка:

    Она выглядит вот так: Как создать свой сайт

  2. Текстовая ссылка:

    Она выглядит вот так: Как создать свой сайт

  3. BB-код ссылки для форумов (например, можете поставить её в подписи):

Комментарии (45):

berest berest 05.07.2011 14:42:24

У меня возникла такая проблема: Денвер выдает следующее: """"Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at Z:homelocalhostwww est2.php:7) in Z:homelocalhostwww est2.php on line 8"""" Текст проги: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title></title> </head> <?php session_start(); ?> <body> </body> </html>

Ответить

Admin Admin 05.07.2011 14:48:55

Нельзя вызывать session_start() после того как было использовано либо echo, либо просто был выведен HTML-код. Сначала заголовки, потом тело!

Ответить

berest berest 05.07.2011 14:59:27

Да, теперь я написал скрипт перед доктайпом, а не между тегами <body> и все заработало. Видимо правильно так... Спасибо.

Ответить

bposter bposter 27.10.2011 19:51:33

в файле index.php кроме кода <?php session_start(); if (isset($_SESSION['name'])) $name = $_SESSION['name']; else $_SESSION['name'] = "15St"; echo $name; нече нету и выдает ошибку Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at Z:\home\localhost\www\demo\index.php:1) in Z:\home\localhost\www\demo\index.php on line 2

Ответить

Admin Admin 27.10.2011 22:49:47

Скорее всего, либо перед <?php стоит какой-нибудь пробел, либо кодировка файла UTF-8, а нужно, чтобы была UTF-8 без BOM.

Ответить

bposter bposter 27.10.2011 22:51:27

ясно спс будем разбиратся

Ответить

morozov-semen morozov-semen 31.03.2012 18:40:23

Здравствуйте, Михаил. Столкнулся с такой проблемой. У меня стоит набор денвер и почему-то в нем постоянно возникает такой глюк: вроде бы такая команда нормально создает сессию "ini_set('session.save_path', '/home/test1.ru/www/data/ses'); if (isset($_REQUEST[session_name()])) session_start();", но вот иногда сессия просто почему-то не создается. Я заметил, что когда я отключаю эти строчки, и записываю просто "session_start();", а потом опять их возвращаю, то опять все работает. Не подскажите в чем проблема, может денвер битый, или как-то с WINDOWS7 не дружит.

Ответить

Admin Admin 31.03.2012 19:36:32

Никто так не пишет. Просто session_start() и всё, без if. А ini_set() лучше в .htaccess вынести.

Ответить

morozov-semen morozov-semen 31.03.2012 19:43:47

При помощи session_start(); создаются несколько различных сессий а вот с помощью этой команды сессия создается один раз на время пользования.

Ответить

Admin Admin 31.03.2012 19:45:59

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

Ответить

morozov-semen morozov-semen 31.03.2012 19:50:57

Я не знаю, но в денвере почему-то сессии создаются многократно после обновления страницы index.php . Может программа считает, что заходят разные пользователи. Я просто уже замучался удалять эти сессии.

Ответить

Admin Admin 31.03.2012 20:00:01

И пусть создаются, они сами удаляются.

Ответить

morozov-semen morozov-semen 31.03.2012 20:04:43

Они просто создают нагрузку на денвер и он вылетает.

Ответить

morozov-semen morozov-semen 31.03.2012 20:03:14

Я сейчас заметил кое-какой нюанс с session_start; когда я перехожу по ссылкам внутри index.php сессия создается как вы сказали один раз, а вот стоит только обновить страницу в браузере, то создается новая сессия, а старая не удаляется, и так многократно при обновлении страницы.

Ответить

Admin Admin 31.03.2012 20:09:00

Последний раз повторяю: выкиньте эти isset() перед сессиями навсегда. Всегда пишите session_start()! Всё, про остальное забудьте!

Ответить

morozov-semen morozov-semen 31.03.2012 20:12:22

Извините пожалуйста меня за такую настойчивость с моей стороны. А тогда не подскажите, как удалить старую сессию, если запустилась другая.

Ответить

Admin Admin 31.03.2012 20:15:01

Их не надо удалять. Они сами удаляются со временем, писал же уже.

Ответить

morozov-semen morozov-semen 31.03.2012 20:16:35

А как изменить время удаления?

Ответить

Admin Admin 31.03.2012 20:19:18

ini_set('session.gc_maxlifetime', 1000); ini_set('session.cookie_lifetime', 1000); Здесь поставил 1000 секунд.

Ответить

morozov-semen morozov-semen 31.03.2012 20:21:52

Огромное спасибо!

Ответить

morozov-semen morozov-semen 31.03.2012 20:31:21

Я к чему это все спрашивал: вот допустим на сайт в данный момент времени зайдет 1000 пользователей, следовательно будет создано 1000 сессий, и если каждый пользователь обновит сайт 10 раз, тогда будет 10 000 сессий, по идее это будет нагрузкой на сервер, что лучше для уменьшения нагрузки 1000 или 10 000. Не знаю, я вам ничего плохого не говорю, я просто высказываю свою точку зрения...

Ответить

Admin Admin 31.03.2012 20:33:30

Если эти пользователи 10 раз обновят сайт, то останутся те же 1000 сессий.

Ответить

morozov-semen morozov-semen 31.03.2012 20:35:49

Но как могут остаться 1000 сессий, если вы сами говорили, что старая удаляется со временем.

Ответить

Admin Admin 31.03.2012 20:37:39

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

Ответить

morozov-semen morozov-semen 31.03.2012 20:42:27

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

Ответить

Admin Admin 31.03.2012 20:48:51

Он не создаёт. Он создаст только если время жизни сессии очень маленькое.

Ответить

morozov-semen morozov-semen 31.03.2012 20:49:19

Извините пожалуйста, я ошибся - я проверил, действительно session_start(); создает одну сессию, я спутался, создаются множество файлов в папке с сессиями.

Ответить

morozov-semen morozov-semen 31.03.2012 20:58:32

Используя данную команду ini_set('session.save_path', '/home/test1.ru/www/data/ses'); if (isset($_REQUEST[session_name()])) session_start(); создается один файл сессии независимо от обновлений. В том, что я вам утверждал я допустил грубую ошибку, я сказал, что будто бы создаются много сессий - я был не прав. Создаются не сессии, а отдельные файлы сессий.

Ответить

morozov-semen morozov-semen 31.03.2012 21:13:51

Простите меня пожалуйста, что я отнял у вас столько времени со своим глупым вопросом...Я искренне извиняюсь...

Ответить

ac-40-6.0 ac-40-6.0 28.07.2012 02:05:49

Миш, еще один глупый вопрос. Задал время жизни сессии 5 минут. Если пользователь не закрыл вкладку со страницей, но не совершает никаких действий, сессия уничтожится или необходимо делать обновление страницы?

Ответить

Admin Admin 28.07.2012 12:57:04

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

Ответить

ac-40-6.0 ac-40-6.0 28.07.2012 13:26:06

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

Ответить

Admin Admin 28.07.2012 22:38:52

Записывайте значения value во все поля $login=$_POST['login'];

Ответить

ac-40-6.0 ac-40-6.0 29.07.2012 01:29:08

Хороший совет. Я о нем тоже подумал. Есть одно маленькое НО! Как получить данные если форма еще не заполнена, а данные не отправленны на сервер. Ведь обновление страницы происходит на стороне клиента без отправки данных.

Ответить

ac-40-6.0 ac-40-6.0 29.07.2012 01:33:48

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

Ответить

Admin Admin 29.07.2012 12:10:40

Да, такое только на javascript и можно реализовать.

Ответить

ac-40-6.0 ac-40-6.0 29.07.2012 12:46:43

Спасибо, Миш. Значит будем разбираться со скриптами. Скоро буду доставать с вопросами по JavaScript.

Ответить

jumong jumong 01.02.2014 12:23:59

Привет Михаил.У меня такой вопрос.У меня есть страничка aut.php которая занимается авторизацией.Вторая страничка user.php это страничка пользователя.У меня такой вопрос.В aut.php сначала надо получить логин и пароль сравнить их с логином и паролем в базе данных а потом сделать редирект в user.php а там уже записать логин и пароль в сессию или как???Неделью уже мучаюсь с этими сессиямы ничего у меня не получается

Ответить

alexandrdante alexandrdante 01.02.2014 12:48:52

да,верно,лучше всего так)

Ответить

jumong jumong 01.02.2014 15:41:02

хорошо попитаюсь так сделать)

Ответить

Kovalenko Kovalenko 27.07.2014 19:13:54

Здравствуйте:) Подскажите, пожалуйста:) как отправить phpsessid в куки на длительный срок? По умолчанию, кажется, phpsessid в куках находится до закрытия браузера =\

Ответить

tikkiwiki tikkiwiki 28.07.2014 09:25:36

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

Ответить

Kovalenko Kovalenko 28.07.2014 15:03:36

как отправить в куки SESSID на длительное время? по умолчанию - sessid будет существовать до закрытия браузера.

Ответить

kajnaea kajnaea 20.01.2015 12:44:52

Михаил, подскажите пожалуйста какой код нужно написать что бы после нажатия кнопки "Закончить оформления заказа" корзина автоматически очищалась? товары в корзине хранятся в сессии, после того как закрываешь браузер данные сохраняются.

Ответить

BotaniQue BotaniQue 27.01.2015 17:36:36

Здравствуйте! Может кто-нибудь знает - как сделать чтобы сессия действовала на субдомене? А то создаются отдельные сессии для основного сайта и субдомена.

Ответить

Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.