Иногда бывает необходимо сделать изменения в клиентской сессии так сказать «на лету». Например, мы храним в сессии пользователя его уровень доступа, и решаем повысить или понизить его. Как здесь быть? Конечно можно внести необходимые изменения в базу, и разлогинить пользователя, тем самым заставив его перечитать обновленные данные из базы. Но этот вариант имеет огромный недостаток — пользователю придется произвести вход, с вводом логина и пароля (либо в случае с авторизацией через соцсети (oAuth) переполучением токена, что тоже не очень удобно, и не располагает к нам клиента:)).
Представленный вашему вниманию класс php написан с целью расширения базового функционала php-сессий.
С его помощью мы можем работать с пользовательскими данными, скрытыми в сессии, зная лишь его session_id (заботливо сохраненном при авторизации (например в базе mysql)).
Класс имеет 3 паблик метода , set, get и del. Вот небольшой пример, иллюстрирующий его работу:
$session_data=sessions::get($id); $session_data['client']['level']='admin'; sessions::set($id,$session_data); где $id - идентификатор, полученный в результате выполнения функции session_id(); результат работы кода аналогичен выполнению $_SESSION['client']['level']='admin'; в контексте клиента.
Ниже сам класс (код)
class sessions { public static function get($id) { $session_data = self::read($id); return self::unserialize($session_data); } public static function set($id, $session_data) { $session_data = self::serialize($session_data); return self::write($id, $session_data); } public static function del($id) { $file = session_save_path() . '/sess_' . $id; unlink($file); } private static function read($id) { $file = session_save_path() . '/sess_' . $id; if (file_exists($file)) return file_get_contents($file); } private static function write($id, $session_data) { $file = session_save_path() . '/sess_' . $id; if (file_exists($file)) return file_put_contents($file, $session_data); } private static function serialize($session_data) { $method = "serialize_" . ini_get("session.serialize_handler"); return self::$method($session_data); } private static function unserialize($session_data) { $method = "unserialize_" . ini_get("session.serialize_handler"); return self::$method($session_data); } private static function serialize_php($session_data) { $out = ''; foreach ($session_data as $name => $value) $out.=$name . '|' . serialize($value); // $out = 's:' . strlen($out) . ':"' . $out . '";'; return $out; } private static function unserialize_php($session_data) { $return_data = array(); $offset = 0; while ($offset < strlen($session_data)) { if (!strstr(substr($session_data, $offset), "|")) { throw new Exception("invalid data, remaining: " . substr($session_data, $offset)); } $pos = strpos($session_data, "|", $offset); $num = $pos - $offset; $varname = substr($session_data, $offset, $num); $offset += $num + 1; $data = unserialize(substr($session_data, $offset)); $return_data[$varname] = $data; $offset += strlen(serialize($data)); } return $return_data; } private static function serialize_php_binary($session_data) { throw new Exception("The php_binary serializer supported in future :)"); } private static function unserialize_php_binary($session_data) { $return_data = array(); $offset = 0; while ($offset < strlen($session_data)) { $num = ord($session_data[$offset]); $offset += 1; $varname = substr($session_data, $offset, $num); $offset += $num; $data = unserialize(substr($session_data, $offset)); $return_data[$varname] = $data; $offset += strlen(serialize($data)); } return $return_data; } }
Пользуйтесь на здоровье.
ps: меня не хватило на реализацию метода serialize_phpbinary , и наверно поэтому он появится в следующих версиях этого класса , но если кто-то меня опередит — милости просим в коменты/email