Сессии в PHP — часть первая для Чайников
Сессии в PHP работают по простому и исторически известному приципу: данные сессии хранятся на сервере, а идентификатор сессии устанавливается в cookies пользователя.
По умолчанию это выглядит вот так:
- Клиенту устанавливается кука PHPSESSID, значение которой — идентификатор сессии клиента. Обычно это строка примерно такого вида — » cmcjeagp3289oga05a2nw3qga6 «
- На сервере к этому идентификатору привязывается место, в котором хранятся данные именно этого клиента.
Имя куки, которую устанавливает php можно изменить в параметре session.name в php.ini:
или с помощью ini_set:
или с помощью вызова session_name:
Когда на сервер приходит запрос от клиента, то браузер всегда передает все необходимые куки. Таким образом, когда php получает запрос, он «узнает» клиента по куке и теперь данные его сессии доступны внутри глобальной переменной-массива $_SESSION.
В PHP-сессии по умолчанию выключены и для их включения необходимо вызывать session_start(), либо настроить в php.ini автозапуск сессий:
Если 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']++;
Если обращаться к этому файлу в браузере, будут вот такие ответы:
Следующий ответ после F5:
Следующий ответ после F5:
Можно посмотреть на имена кук и поиграть с этим руками:
$ 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) >
Полезная документация
- http://php.net/manual/ru/book.session.php — сессии в php
- http://php.net/manual/ru/memcached.sessions.php — сессис в php хранимые в memcached
- Установка модулей php на debian/ubuntu

Curl в PHP
Curl — это библиотека для работы с URL. Она интегрирована во множество языков, в том числе и в PHP.
Почему timeout для curl в php необходим
Использование cURL в PHP имеет свою не очень приятную особенность — вечная блокировка процесса
Капризы WebSocket и при чём здесь костыли
Протокол WebSocket имеет свои преимущества и свои недостатки: детальный разбор
IoT Highload: особенности и подводные камни
Особенности серверных приложений, работающих с сетью IoT-устройств на практике и в теории
Об архитектуре системы морского навигатора
В проекте морской навигации есть особенность, грамотная реализация которой и позволяет жить всей системе
Настройка сессий в php.ini
Прежде чем начать работать с сессиями , следует разобраться в том, как корректно настраивать их обработку интерпретатором PHP. Сама работа с сессиями в PHP поддерживается по умолчанию. Это значит, что устанавливать никаких дополнительных элементов не нужно. А вот знать, что записано в настройках этого модуля, полезно, чтобы избежать ошибок при работе с ним.
Настройки PHP, в том числе и для работы с сессиями , прописываются в файле php.ini . Обратимся к этому файлу.
Как мы уже знаем, идентификатор сессии (число, по которому можно уникально идентифицировать клиента, пославшего запрос) сохраняется либо на компьютере-сервере, либо на компьютере-клиенте, либо и там, и там.
Параметр session.save_path в php.ini , определяет, где на сервере будут храниться данные сессии . Из-за него чаще всего возникают проблемы для Windows-серверов, потому что по умолчанию значение session.save_path установлено в /tmp . И если в корневой директории сервера такой папки нет, то при запуске сессий будет выдаваться ошибка.
Сервер может обрабатывать большое количество сессий одновременно, и все их временные файлы будут храниться в директории, заданной параметром session.save_path . Если система плохо работает с папками большого размера, то удобно использовать поддиректории. Для этого, кроме названия папки, в значение параметра добавляют еще и число, определяющее глубину вложенности поддиректорий в этой папке: N; /dir . Это значение нужно обязательно взять в кавычки, поскольку точка с запятой является одним из символов комментариев в файле настроек PHP. Все директории и поддиректории для хранения данных сессии нужно создать самостоятельно.
Например : 2; /Temp определяет, что переменные сессий будут храниться в папках вида c: \Temp\0\a\ , c: \Temp\0\b\ и т.п.
Хранение данных на стороне клиента осуществляется с помощью cookies . Работу PHP с cookies можно настроить, в частности, с помощью параметров session.use_cookies , session.cookie_lifetime и т.п.
Параметр session.use_cookies определяет, использовать ли cookies при работе с сессиями . По умолчанию эта опция включена (т.е. принимает значение «1» ).
Параметр session.cookie_lifetime задает длительность жизни cookies в секундах. По умолчанию это «0» , т.е. данные в cookies считаются правильными до закрытия окна браузера .
Кроме этих параметров, полезными могут оказаться session.name , определяющий имя сессии , session.auto_start , позволяющий автоматически запускать сессии , session.serialize_handler , задающий способ кодировки данных сессии , и параметр session.cache_expire , определяющий, через сколько минут устаревает документ в кэше.
Имя сессии session.name по умолчанию устанавливается как PHPSESSID и используется в cookies как имя переменной, в которой хранится идентификатор сессии . Автоматический запуск сессий по умолчанию отключен, но его можно задать, сделав значение session.auto_start равным «1» . Для кодирования данных сессии по умолчанию используется php. Устаревание данных, сохраненных в кэше, происходит через 180 минут.
Существует еще множество настроек, с которыми можно познакомиться в документации или непосредственно в файле настроек php.ini . На наш взгляд, знакомства с перечисленными выше параметрами достаточно для работы с сессиями в PHP. Так что приступим.
-
© INTUIT.ru. Автор: Н.В. Савельева. Курс размещен по договоренности с администрацией INTUIT.ru
Как найти папку, в которой хранятся файлы сессий

Как известно, файл сессии
– хороший способ раскрутить локальный инклуд, но
как же определить папку в которой они находятся?
Ведь не всегда они хранятся в /tmp. Привожу
излюбленные мной способы поиска заветной папки.
1. Поиск phpinfo() на сайте.
Для этого ищем session.save_handler. Если его
значение установлено в «files» по дефолту,
значит сессии хрантся в файлах, ниже находится
значение session.save_path.
Первое значение – это так называемое Local
Value, уникально значение для конкретной папки и
ее подпапок (либо для конкретного сайта),
устанавливается в .htaccess.
Второе значение – это Master Value , общее
значение для всего сервера, устанавливается в
php.ini.
2. Поиск .htaccess, в этом
файле может быть установлено значение php_value
для session.save_path.
3. Простой перебор папок.
Привожу небольшой список возможных вариантов
каталогов, где может находиться желаемое.
/tmp/
/php_sess/
/tmp/phpsess/
/tmp/php/
/tmp/php-sess/
/home/%username%/tmp/
/var/phptemp/
/var/phptmp/
/var/phpsess/
/var/php-sess/
/var/lib/php/
/var/lib/php/session/
/var/lib/php3
/var/lib/php3/session/
/var/lib/php4/
/var/lib/php4/session/
/var/lib/php5/
/var/lib/php5/session/
/var/lib/php6/
/var/lib/php6/session/
/www/phpsession/
C:\Temp
C:\WINDOWS\Temp
C:\PHP\sessiondata
Где хранятся данные из массива SESSION?
настроил htaccess session.save_path site/var/sessions/
теперь файлы сессий сохраняются в него
сделал session_start
записал переменную в сессию $_SESSION[‘file’] = ‘file’
отлично считывается и все работает
но в самом файле в папке site/var/sessions/sess_sfsdfj4j234 нет этих данных, он пустой
соответственно переменные из массива SESSION хранятся в памяти компьютера, а не в файле?
как сделать сохранение в файл?
- Вопрос задан более трёх лет назад
- 761 просмотр
3 комментария
Простой 3 комментария
может кэш какой? обычно сразу записывается в файл по завершению запроса или ручном завершении сессии

Максим Тимофеев @webinar Куратор тега PHP
хранятся в памяти компьютера, а не в файле?
А файл храниться где? И как хранить в памяти без файла?
настроил htaccess session.save_path site/var/sessions/
и что? Чего Вы решили, что это работает?
Для верности стоит проверить реальный путь, который в данный момент работает:
php.net/manual/ru/function.session-save-path.php
И убедиться еще, что папка в которую Вы пишите имеет право на запись.
knowledge @knowledge Автор вопроса
Максим Тимофеев,
«для верности» проверил, все работает, файлы сессий пишутся в /var/sessions/, правда все данны
все работает как надо, кроме того, что эти файлы пусты, в них нет данных, которые я записываю в массив SESSION
«для пущей верности» сверил свой PHPSESSID, в /var/sessions/ есть файл с таким названием, но он пустой, хотя данные в нем записаны и из массива выводятся
закрывал браузер, открывал, все равно данные есть, а в файле пусто
