Сессии
PHP Manual

Класс SessionHandlerInterface

(PHP 5 >= 5.4.0, PHP 7)

Введение

SessionHandlerInterface - это интерфейс который определяет прототипы для создания пользовательского обработчика сессии. Для предоставления пользовательского обработчика сессии функции session_set_save_handler() используя ее объектно-ориентированную реализацию, класс должен реализовывать этот интерфейс.

Обратите внимание, что callback-методы этого класса созданы для внутренних вызовов PHP и не предназначены для вызовы из вашего кода.

Обзор классов

SessionHandlerInterface {
/* Методы */
abstract public bool close ( void )
abstract public bool destroy ( string $session_id )
abstract public bool gc ( int $maxlifetime )
abstract public bool open ( string $save_path , string $session_name )
abstract public string read ( string $session_id )
abstract public bool write ( string $session_id , string $session_data )
}

Пример #1 Пример использования SessionHandlerInterface

Следующий пример реализует файловую сессию таким же образом, как это реализовано во внутреннем обрабтчике сессии PHP. Этот пример может быть легко расширен для обеспечения хранения сессий в предпочитаемой вами базе данных.

Обратите внимание, что мы используем объектно-ориентированные прототипы с функцией session_set_save_handler() и регистрируем функцию завершения (shutdown) используя один из параметров этой фунции. Это действие рекомендуется производить в большинстве случаев, когда объекты регистрируются в качестве обработчиков сессии.

Предостережение

Для краткости в этом примере не добавлена проверка входных данных. Обратите внимание, что параметр $id предоставляется пользователем и обязательно должен проверяться для исключения возможных атак, использующих, например, проблемы обхода пути. Так что ни в коем случае не используйте этот код в промышленной эксплуатации, не добавив соответствующие проверки.

<?php
class MySessionHandler implements SessionHandlerInterface
{
    private 
$savePath;

    public function 
open($savePath$sessionName)
    {
        
$this->savePath $savePath;
        if (!
is_dir($this->savePath)) {
            
mkdir($this->savePath0777);
        }

        return 
true;
    }

    public function 
close()
    {
        return 
true;
    }

    public function 
read($id)
    {
        return (string)@
file_get_contents("$this->savePath/sess_$id");
    }

    public function 
write($id$data)
    {
        return 
file_put_contents("$this->savePath/sess_$id"$data) === false false true;
    }

    public function 
destroy($id)
    {
        
$file "$this->savePath/sess_$id";
        if (
file_exists($file)) {
            
unlink($file);
        }

        return 
true;
    }

    public function 
gc($maxlifetime)
    {
        foreach (
glob("$this->savePath/sess_*") as $file) {
            if (
filemtime($file) + $maxlifetime time() && file_exists($file)) {
                
unlink($file);
            }
        }

        return 
true;
    }
}

$handler = new MySessionHandler();
session_set_save_handler($handlertrue);
session_start();

// продолжаем работать с переменными сессии, устанавливая или читая их значение из $_SESSION

Содержание


Сессии
PHP Manual