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

По умолчанию это выглядит вот так:

  • Клиенту устанавливается кука PHPSESSID значение котрой - идентификатор сессии клиента. Обычно это строка примерно такого вида - "cmcjeagp3289oga05a2nw3qga6"

  • На сервере к этому идентификатору привызявается место в котором хранятся данные именно этого клиента.

Имя куки, которую устанавливает php мижно изменить в параметре session.name в php.ini:

session.name = 'ваше-имя-сессионной-куки'

или с помощью ini_set:

ini_set('session.name', 'ваше-имя-сессионной-куки');

или с помощью вызова session_name:

session_name('ваше-имя-сессионной-куки');

Когда на сервер приходит запрос от клиента - то браузер всегда передает все необходимые. Таким образом, когда php получает запрос - он "узнает" клиента по куке и теперь данные его сессии доступны внутри глобальной пременной-массива $_SESSION.

В PHP сессии по умолчанию выключены и для их включения необходимо вызывать session_start() либо настроить в php.ini автозапуск сессий:

session.auto_start = 1

Если session.auto_start выключен, то массив $_SESSION не будет связан с конкретной сессий до вызова session_start(). По этому не забывайте запускать session_start() в самом начале работы, до выполнения какой либо логики.

Каким же образом сессии хранятся на сервере?

За это отвечает настройка session.save_handler и ее уточненяющая настройка session.save_path. Если установить на сервер расширение php-memcached будут доступны следующие варианты для session.save_handler:

  • "files" - хранить сессии в файлах. В session.save_path заполняется путь к директории, в которой будут хранится сессии

  • "memcached" - хранить сессии на сервере memcached. В session.save_path указывается строка подключения к серверу, например: "127.0.0.1:11211". Подробнее это описано здесь

Собственно в случае memcached ключ образуется из идентификатора сессии, а в случае работы с файлами - имя файла состовляется из идентификатора.

Рабочий пример

Как пользоватся сессиями на прстом и рабочем примере:

session_name('my-session-name'); //задаем имя куке до вызова session_start
session_start();                                     //запускаем сессию (указываем session_start явно, чтобы не зависить отнастроек конкретного сервера
var_dump($_SESSION);                      //выводим что имеется в сессии

//создаем счетчик при первом обращении
if (empty($_SESSION['count'])) {
    $_SESSION['count'] = 0;  
}

//считаем кол-во запросов пользователя
$_SESSION['count']++;

Если обращатся к этой файлу в браузере будут вот такие ответы:

array(1) { }

Следующий ответ после F5:

array(1) { ["count"]=> int(1) }

Следующий ответ после F5:

array(1) { ["count"]=> int(2) }

Можно посмотреть на имена кук и поиграть с этим руками:

$ curl -i http://127.0.0.1/
HTTP/1.1 200 OK
Server: nginx/1.6.2
Date: Fri, 10 Feb 2017 21:12:19 GMT
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
Set-Cookie: my-session-name=ft766dgk625rno96c638uqb643; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache

array(0) {

}


Мы видим что нас дали ответ с загшоловком Set-Cookie и установили идентификатор сессии. Первый ответ пустой массив как и в случае с браузером. Попробуем отправить второй запрос передав куку:

$ curl -i --cookie my-session-name=ft766dgk625rno96c638uqb643 http://127.0.0.1/
HTTP/1.1 200 OK
Server: nginx/1.6.2
Date: Fri, 10 Feb 2017 21:13:22 GMT
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache

array(1) {
 ["count"]=>
 int(1)
}

И еще раз:

$ curl -i --cookie my-session-name=ft766dgk625rno96c638uqb643 http://127.0.0.1/
HTTP/1.1 200 OK
Server: nginx/1.6.2
Date: Fri, 10 Feb 2017 21:13:32 GMT
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache

array(1) 
  ["count"]=>
  int(2)
}

Если мы изменим куку - у нас будет другая (в нашем случае новая пустая) сессия:

$ curl -i --cookie my-session-name=blabla http://127.0.0.1/
HTTP/1.1 200 OK
Server: nginx/1.6.2
Date: Fri, 10 Feb 2017 21:13:55 GMT
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache

array(0) { }

При повторном общаении "левая" сессия будет работать:

$ curl -i --cookie my-session-name=blabla http://127.0.0.1/
HTTP/1.1 200 OK
Server: nginx/1.6.2
Date: Fri, 10 Feb 2017 21:14:15 GMT
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache

array(1) {
  ["count"]=>
  int(1)
}

Полезная документация


О безопасности, рисках и вложениях

Как сделать так, чтобы Ваш IT-отдел не стал местом утечки информации за которую Вы отвечаете?

Проблемы WebSocket в средней полосе России

Протокол WebSocket имеет свои преимущества и свои недостатоки: детальный разбор

LetsEncrypt: делаем фальшивый cert своими руками

Имеется такое явление набравшее свою популярность, как letsencrypt/certbot. Он выдает ssl-сертификаты автоматически и всем подряд. В целом это его основная проблема.

Сводная система мониторинга

Позволяет решать интеллектуальные задачи, помимо задач самого мониторинга

Nginx, Php-Fpm и что это вообще?

Что такое php-fpm и зачем он нужен более-менее посещаемым проектам? Какие неприятности несет в себе переход с apache на fpm? Какие проблемы решает реально, а какие - надумано?

Почему балансировщик http нужно размещать в другом сегменте

И снова о маленьких сетевых фокусах ради надежности работы web-сервисов