WeBinstruments

Инструментарий для веб-мастеров

 

Техподдержка и
сопровождение
сайтов


на сайте на всех сайтах для веб разработчиков везде
 
 Скрипты
  PHP скрипты   
  Flash скрипты   
  Javascript скрипты   

 Софт
  Инструменты SEO   
  Разработка сайтов   
  Серверное ПО   

 Документация
  MySQL   
  PHP   
  HTML   
  Протоколы и сервисы Internet   

 Статьи
  PHP   
  MySQL   
  Сервер   
  еще...   

 Услуги и сервисы
  Домены   
  Хостинги   
  Блоки для сайта   

 Новости


 Контакты
  icq: 158325531
  email:
  все контакты: здесь




Atom все поступления
Раздел Новости
Раздел Услуги и сервисы
Раздел Статьи
Раздел Файлы
комментарии

Главная / Статьи / PHP / Сессии в PHP


Сессии в PHP

10.07.2007
сайт автора: http://webi.ru
публикация данной статьи разрешена только со ссылкой на сайт автора статьи

Что такое сессии в PHP?
С помощью сессий можно передавать произвольное количество переменных и хранить их между запросами.
Нет необходимости передавать переменные в запросе, все они хранятся на сервере, а доступ к ним осуществляется с помощью уникального номера, присвоенного при старте сессии. Номер сессии(SID) выглядит подобным образом "e591e8ab5892a486f60f208487152348".
Каждый посетитель сайта получает уникальный номер сессии, по этой причине в сессиях можно хранить данные, относящиеся к конкретному посетителю, не боясь, что эти данные увидит кто-то другой. Хранение переменных в сессиях обеспечивает сокрытие данных, если нужно передавать логин и пароль от страницы к странице, то сессии это один из вариантов.
Если нужно передавать большое количество переменных или большие текстовые переменные, опять же сессии в этой ситуации самый оптимальный вариант, так как не надо передавать большие переменные от запроса к запросу, создавая большой трафик на стороне клиента и на стороне сервера.

Как работают сессии?
При посещении страницы клиенту присваивается уникальный номер и сохраняется в куках браузера. Вместе с этим на сервере создается файл с номером этой сессии.
И теперь, когда посетитель сайта будет перемещаться по страницам сайта, его браузер будет передавать на сервер этот номер и с помощью php можно получать доступ к файлу с этим номером, в котором и будут храниться все переменные сессий.
Номер сессии в куке будет жить пока посетитель ходит по сайту и пока не закроет браузер (настройка по умолчанию). При следующем посещении этому посетителю будет выделен уже другой номер сессии.
Когда сессия запущена, можно сохранять в ней переменные, которые будут доступны только этому посетителю во время перемещений по сайту.

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

<?
// файл 1.php
session_start();
$_SESSION['asd']='aaaaaa';
$_SESSION['name']['qwe']='тест';
?>
<a href="2.php">тест</a>

<?
// файл 2.php
session_start();
print
$_SESSION['asd'];
print
$_SESSION['name']['qwe'];
?>

Чтобы начать работать с сессиями, надо запустить их (session_start();)
И после этого появляется доступ к глобальному массиву $_SESSION.
В примере видно, что массив может быть не только одномерным. Это обычный массив и работать с ним можно как с обычным массивом.
В первом файле присваиваем значения в сессии, во втором файле этот массив доступен и можно получать из него данные, можно добавлять и удалять данные.

Побочные эффекты сессий.
Некоторые сервера (хостинги или выделенные сервера) при работе с сессиями настроены таким образом, что если номер сессии нельзя передать в куку браузера (например куки отключены), то номер сессии будет передаваться в ссылках. Конечно это очень удобно, сервер сам автоматически определяет работают куки или нет и выбирает место хранения номера сессии в куке или в адресе ссылки. При этом ко всем вашим ссылкам будет автоматически добавляться номер сессии(SID), например так test.ru/index.php?PHPSESSID=e591e8ab5892a486f60f208487152348.
Такой универсальный подход очень хорош, если такие страницы не будут индексироваться поисковыми системами.
Если же ваш сайт будут посещать поисковики, то они конечно не будут принимать куки и увидят ссылки с номерами сессий.
Многие поисковые системы не любят таких ссылок и занижают релевантность страниц.
Поэтому лучше не разрешать использование SID в URL, это наплодит большое количество ссылок с устаревшими сессиями.

Как запретить использовать SID в URL.
Если у вас есть доступ к настройкам php.ini, вы можете отключить использование номера сессии в URL:
session.use_trans_sid = 0
Но не у всех есть доступ к настройкам php. Поэтому приведу несколько примеров, как сделать url более привлекательным для поисковиков не меняя настройки php.

1. В некоторых случаях избавиться от SID в ссылке можно используя полный путь в ссылке.
То есть если у вас ссылка имеет вид <a href="test.php">тест</a>, то SID будет добавлен автоматически (если не получится добавить в куки), если использовать полный путь <a href="http://site.ru/test.php">тест</a>, тогда SID не добавится (зависит от настроек сервера).

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

3. Иногда бывает необходимо стартовать сессии в любом случае. Если не получается избавиться от SID в ссылке с помощью использования полного адреса, можно сделать SID одинаковым, чтобы не размножать ссылки с уникальными номерами.
В php есть константа SID, которая доступна в том случае, если номер сессии не получилось вставить в куки. Если номер сессии удалось вставить в куки, то эта константа будет пустой.
Значение именно этой константы и добавляется в ссылку. Константа SID имеет примерно такое строковое значение "PHPSESSID=e591e8ab5892a486f60f208487152348".
Значит можно сделать проверку на присутствие значения в этой константе. Если присутствует что-то в ней, то можно отключать сессии.
Можно разрушить сессию, можно удалит все переменные из сессии, но все это не спасет от добавления SID в ссылку, если отключены куки.
Раз уж SID все равно будет добавляться, тогда сделаем его не уникальным, тогда не будет так много разных ссылок.

<?
session_start
();
if(
SID)
{
  session_destroy();
  session_id('no');
  session_start();
  session_destroy();
}
?>

После старта сессий проверяем, есть ли что-то в SID
Если в SID есть что-то, значит номер сессии не установился в куки и при определенных настройках сервера номер добавится в ссылку. Дальше разрушим сессию, тоесть удалим файл сессии(session_destroy();)
Теперь создаем новый номер сессии, не уникальный (session_id('no');). Сейчас номер сессии будет просто "no".
Чтобы новый номер сессии заменил предыдущий, нужно еще раз стартовать сессию(session_start();).
И на всякий случай можно разрушить сессию, удалить файл этой новой сессии (session_destroy();)

Теперь ко всем ссылкам будет добавляться PHPSESSID=no, но работать эти сессии не будут, будут работать только те сессии, которые смогут установить куки.

Этот вариант можно конечно доработать, поставить проверки на поисковики и т.д.




Комментарии

RSS комментарии


06.02.2009 Snitko
ХОрошенькая статейка!!!
Полезная!
Спасибо!!!!
---------





25.05.2009 Anatol
Спасибо! Нашел то что искал!



21.06.2009 Alone_MonaX
Чувак спасибо за стутью, как раз не хватало её!

Если чё понадобиться стучи в ICQ:392922556



01.09.2009 Eugeneus
Статья сцупер



07.12.2009 Украинец
Огромное спасибо.



10.01.2010 Сергей С.
Гений!



10.02.2010 Игнат
Идея неплохая, советы пригодяться!
Спасибо!



26.07.2010 ирина
спасибо за информацию!



11.03.2011
Похоже это единственная статья по сессиям, которая заслуживает уважения
(Я даже не поленился оставить комментарии, никогда в жизни етого не делал)



12.08.2011 Слава
Спасибо за статью. Помогла.



23.01.2012 Дмитрий
Прекрасно освежила память!!! Немного подзабыл пару деталей, статья восстановила в памяти толстую книжку прочитанную когда-то ))))))



28.01.2012
Спасибо!



17.03.2012 Толян
одно слово "Молодец"



23.05.2012 балабол
Скажите а вот таким способом можно разрушить сессию?
unset($_SESSION['name']);
не
session_destroy();
а как я написал.



24.05.2012 нло
Спасибо за статью. Все очень доходчиво описано.



06.06.2012 Виктор
23.05.2012 балабол, да, так тоже можно
unset($_SESSION['name']);
и тогда переменная $_SESSION['name'] исчезнет



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


Ваше имя(* обязательно)


Текст сообщения(* обязательно)









 
 
  запомнить

 
Copyright © 2003-2017 WeBi Constructor
Rambler's Top100