Что такое сессии в PHP?
С помощью сессий можно передавать произвольное количество переменных и хранить их между запросами.
Нет необходимости передавать переменные в запросе, все они хранятся на сервере, а доступ к ним осуществляется с помощью уникального номера, присвоенного при старте сессии. Номер сессии(SID) выглядит подобным образом "e591e8ab5892a486f60f208487152348".
Каждый посетитель сайта получает уникальный номер сессии, по этой причине в сессиях можно хранить данные, относящиеся к конкретному посетителю, не боясь, что эти данные увидит кто-то другой. Хранение переменных в сессиях обеспечивает сокрытие данных, если нужно передавать логин и пароль от страницы к странице, то сессии это один из вариантов.
Если нужно передавать большое количество переменных или большие текстовые переменные, опять же сессии в этой ситуации самый оптимальный вариант, так как не надо передавать большие переменные от запроса к запросу, создавая большой трафик на стороне клиента и на стороне сервера. Как работают сессии?
При посещении страницы клиенту присваивается уникальный номер и сохраняется в куках браузера. Вместе с этим на сервере создается файл с номером этой сессии.
И теперь, когда посетитель сайта будет перемещаться по страницам сайта, его браузер будет передавать на сервер этот номер и с помощью php можно получать доступ к файлу с этим номером, в котором и будут храниться все переменные сессий.
Номер сессии в куке будет жить пока посетитель ходит по сайту и пока не закроет браузер (настройка по умолчанию). При следующем посещении этому посетителю будет выделен уже другой номер сессии.
Когда сессия запущена, можно сохранять в ней переменные, которые будут доступны только этому посетителю во время перемещений по сайту.
Практическое применение сессий.
Переменные сессий хранятся в глобальном массиве $_SESSION. После старта сессий можно просто сохранять в этом массиве значения и без всяких лишних действий просто получать значения из него. Приведу пример двух файлов, в первом в сессии будут помещаться переменные, а во втором эти переменные будут получаться из сессии.
Code
<?
// файл 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 все равно будет добавляться, тогда сделаем его не уникальным, тогда не будет так много разных ссылок.
Code
<?
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, но работать эти сессии не будут, будут работать только те сессии, которые смогут установить куки.
Этот вариант можно конечно доработать, поставить проверки на поисковики и т.д.