Сессии

Так как HTTP является stateless протоколом, то web-сервер не знает и не заботится о том, что два запроса идут от одного и того же пользователя. Поддержка сессий в PHP заключается в способе сохранения некоторых данных между несколькими последовательными запросами к веб-сайту.

Каждому посетителю сайта присваивается уникальный идентификатор, называемый идентификатором сессии (session id). Он хранится либо в cookie на стороне пользователя, либо передается через URL.

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

Обработчики сессий

По умолчанию сессии хранятся на диске, используя функции serialize() и unserialize() для обработки данных. Но есть возможность изменить обработчик сессий. Обработчик ответственнен за весь I/O - имеется в виду, что меняется кодирование и раскодирование.

Изменить обработчик можно как в php.ini директивой session.save_handler, так и вызовом функции session_set_save_handler(). По умолчанию значение session.save_handler равно files. Другие механизмы могут быть доступны через расширения. Например, memcache и memcached:

; memcached
session.save_handler = memcached
session.save_path = "host1:11211;host2:11211"

; memcache
session.save_handler = memcache
session.save_path = "tcp://host1:11211,tcp://host2:11211

Чтобы объявить свой обработчик через session_set_save_handler(), нужно определить несколько callback функций, каждую для открытия, закрытия, чтения, записи, уничтожения и сборки мусора. После версии PHP 5.4 стал доступен SessionHandlerInterface. Можно теперь просто определить класс, который реализует этот интерфейс и передать объект этого класса в session_set_save_handler().

class JsonSessionHandler
{
    protected $save_path;
    protected $file;

    public function open($save_path, $session_id) {
        $this->save_path = $save_path;
        $this->file = $save_path
                    . DIRECTORY_SEPARATOR
                    . $session_id
                    . '.json';

        return is_writable($save_path);
    }

    public function close() {
        return is_writeable($this->file);
    }

    public function read($session_id) {
        return json_decode(file_get_contents($this->file));
    }

    public function write($session_id, $data) {
        return (bool) file_put_contents(json_encode($data));
    }

    public function destroy($session_id) {
        unlink($this->file);
        return !is_file($this->file);
    }

    public function gc($maxlifetime) {
        $timeout = time() - $maxlifetime;
        $files = glob($this->save_path
               . DIRECTORY_SEPARATOR
               . '*.json')
        foreach ($files as $file) {
            if (filemtime($file) < $timeout) {
                unlink($file);
            }
        }
    }
}

$handler = new JsonSessionHandler;
session_set_save_handler(
    [$handler, 'open'],
    [$handler, 'close'],
    [$handler, 'read'],
    [$handler, 'write'],
    [$handler, 'destroy'],
    [$handler, 'gc']
);

Функции

unset($_SESSION[‘name’])

  • удалить переменную из сессии.

session_destroy()

  • Уничтожает все данные сессии.
  • Не удаляет session cookie.

session_start()

  • Создает новую или возобнавляет предыдущую сессию.

session_id()

  • Возвращает или устанавливает идентификатор сессии.

session_get_cookie_params()

  • Возвращает массив с информацией о cookie текущей сессии.

session_set_cookie_params()

  • Устанавливает параметры cookie текущей сессии.

session_regenerate_id()

  • Обновляет текущий идентификатор сессии с новым сгенерированным значением.
  • Данные сессии при этом сохраняются.

session_name()

  • Возвращает или устанавливает имя текущей сессии.
  • Если задан параметр $name то он будет текущем именем, а функция вернет старое имя.

session_write_close()

  • Записывает данные в сессию и закрывает ее.

session_commit()

  • Является псевдонимом session_write_close()

session_status()

  • Возвращает статус сессии:
    • PHP_SESSION_DISABLED, если механизм сессий отключен.
    • PHP_SESSION_NONE, если механизм сессий включен, но сессия не создана.
    • PHP_SESSION_ACTIVE, если механизм сессий включен и сессия создана.

session_reset()

  • Откатывает изменения в $_SESSION до последних сохраненных значений в session storage.

Директивы

session.use_trans_sid

указывает, используется ли прозрачная поддержка sid или нет. По умолчанию 0 (отключено). (Идентификатор сессии передается в URL).