Многие начинающие не понимают, что когда они видят страницу сайта в своем браузере, PHP скрипт уже давно отработал и забыл о нас.

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

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

На помощь программистам приходят такие механизмы как сессии и cookie (куки).

Что такое сессии в PHP?

Сессия - это механизм PHP, который позволяет хранить данные для конкретного пользователя между запусками скрипта.

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

С помощью сессии можно реализовать авторизацию пользователей, корзину интернет-магазина и другое.

Инициализируем сессию

Чтобы записать что-то в сессию ее сначала нужно инициализировать с помощью функции session_start():

<?php
	//Инициализируем сессию:
	session_start();
?>

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

Пишем в сессии

После инициализации мы можем записать что-нибудь в сессию.

Сделать это не сложно:

<?php
	//Инициализируем сессию:
	session_start();

	//Пишем в сессию:
	$_SESSION['test'] = 'Тест!';
?>

Читаем из сессий

После того, как мы что-то записали в сессию, мы можем это оттуда извлечь:

<?php
	//Инициализируем сессию:
	session_start();

	//Выведем переменную test из сессии:
	echo $_SESSION['test'];
?>

Возможные проблемы

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

Что такое вывод в браузер?

Это любой символ до <?php, например, текст или тег, даже пробел. Кроме того нельзя делать выводы через echo, var_dump и print_r.

Кодировка вашего документа обязательно должна быть utf-8 без BOM. Если она будет просто utf-8, то перед <?php будет вставлен спец. символ, характерный для данной кодировки и сессии работать не будут.

Если вы делаете какие-то вывод в браузер до работы с сессией, то увидите следующую ошибку: Warning: Cannot send session cookie - headers already sent.

Эта ошибка также вызывается другими сообщениями об ошибках, так как эти сообщения - это вывод в браузер до старта сессии. Обратите на это внимание.

Сделаем счетчик на сессиях

Чтобы продемонстрировать работу с сессиями давайте реализуем счетчик количества обновления страницы пользователем.

При каждом обновлении страницы он будет увеличиваться на единицу, а при закрытии браузера - обнуляться (после закрытия нужно подождать 15-25 минут):

<?php
	//Инициализируем сессию:
	session_start();
	/*
		Переменная $_SESSION['counter'] будет нашим счетчиком.
		Если скрипт запускается первый раз -
		она будет пуста, присвоим ей единицу.
		Если не первый раз - тогда прибавим единицу.
	*/
	if (!isset($_SESSION['counter'])) {
		$_SESSION['counter'] = 1;
	} else {
		$_SESSION['counter'] = $_SESSION['counter'] + 1;
	}

	//Выведем значение счетчика:
	echo 'Вы обновили эту страницу '.$_SESSION['counter'].' раз!';

	/*
		Обновите страницу несколько раз,
		посмотрите на то, как увеличивается значение переменной.
		Затем закройте браузер, подождите полчаса и откройте снова -
		убедитесь в том, что переменная обнулилась!
	*/
?>

Удалении переменных из сессии

Переменную сессии можно удалять с помощью функции unset:

<?php
	//После выполнения этой команды в $_SESSION['var'] станет null:
	unset($_SESSION['var']);
?>

Завершение сессии

Если же вам нужно удалить все переменные сессии для данного пользователя, то вместо unset следует воспользоваться функцией session_destroy() (ее можно вызывать только тогда, когда сессия запущена через session_start):

<?php
	//После выполнения этой команды ВСЕ переменные сессии станут null:
	session_destroy();
?>

Мы рассмотрели принудительное завершение сессии. Однако сессия может завершится сама в двух следующих случаях: при закрытии браузера пользователем или по истечении определенного времени, во время которого пользователь не совершает никаких действий на странице (по умолчанию это время около 15-25 минут).

Какие задачи решает сессия

Стандартные задачи, которые решают с помощью сессии, это корзина интернет-магазина, форма для заполнения пользователем, разбитая на несколько страниц сайта (на первой мы спрашиваем имя, на второй email и т.д.), авторизация пользователей на PHP.