В PHP 5.5.1 есть ссылка на SessionIdInterface. Однако это все еще недокументировано, и единственное, что я могу найти, это определение интерфейса:
interface SessionIdInterface { public function create_sid (); }
SessionIdInterface
был создан как часть запроса 109 запроса php-src и помещен в PHP 5.5.1. Здесь обсуждаются некоторые подробности.
Короче говоря, ваша реализация SessionHandlerInterface
также может реализовать SessionIdInterface
и предоставить метод create_sid
который возвращает строку. PHP автоматически вызовет create_sid
вместо использования внутренних функций создания сеанса, определенных в php.ini.
Вот пример скрипта, который демонстрирует использование.
<?php class SillySessionHandler implements SessionHandlerInterface, SessionIdInterface { static $lol_sessions = []; public function open($save_path, $filename) { return true; } public function close() { return true; } public function destroy($session_id) { return true; } public function gc($lifetime) { return true; } public function read($session_id) { return array_key_exists($session_id, static::$lol_sessions) ? static::$lol_sessions[$session_id] : null; } public function write($session_id, $session_data) { static::$lol_sessions[$session_id] = $session_data; echo "Session data: ", $session_data; } public function create_sid() { $sid = bin2hex(openssl_random_pseudo_bytes(16)); static::$lol_sessions[$sid] = []; return $sid; } } $handler = new SillySessionHandler; session_set_save_handler($handler, true); session_start(); echo "Your session ID is ", session_id(), "<hr>"; $_SESSION['foo'] = 'bar';
Пример вывода:
Идентификатор сеанса: 2e837e0c5f5ac1b23296d384a9aab2af
Данные сеанса: foo | s: 3: «bar»;
Согласно исходному коду PHP:
/* {{{ SessionIdInterface functions[] */ static const zend_function_entry php_session_id_iface_functions[] = { PHP_ABSTRACT_ME(SessionIdInterface, create_sid, arginfo_session_class_create_sid) { NULL, NULL, NULL } }; /* }}} */ /* {{{ SessionHandler functions[] */ static const zend_function_entry php_session_class_functions[] = { PHP_ME(SessionHandler, open, arginfo_session_class_open, ZEND_ACC_PUBLIC) PHP_ME(SessionHandler, close, arginfo_session_class_close, ZEND_ACC_PUBLIC) PHP_ME(SessionHandler, read, arginfo_session_class_read, ZEND_ACC_PUBLIC) PHP_ME(SessionHandler, write, arginfo_session_class_write, ZEND_ACC_PUBLIC) PHP_ME(SessionHandler, destroy, arginfo_session_class_destroy, ZEND_ACC_PUBLIC) PHP_ME(SessionHandler, gc, arginfo_session_class_gc, ZEND_ACC_PUBLIC) PHP_ME(SessionHandler, create_sid, arginfo_session_class_create_sid, ZEND_ACC_PUBLIC) { NULL, NULL, NULL } };
В SessionIdInterface
нет никаких других методов, и create_sid
в этом интерфейсе одинаково с SessionHandler