Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 [ 117 ] 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189

$destroy, будет вызвана при уничтожении сессии. Наконец, обработчик, определяемый параметром $gc, используется как сборщик мусора.

Эту функцию можно вызывать только до инициализации сессии, в противном случае она просто игнорируется.

Пример: переопределение обработчиков

Давайте напишем пример, который бы иллюстрировал механизм переопределения обработчиков. Мы будем держать временные хранилища сессий в подкаталоге sessiondata текущего каталога, и для каждого имени группы сессий создавать отдельный каталог.

Код листинга 25.2 довольно велик, но не сложен. Тут уж ничего не поделаешь - нам в любом случае приходится задавать все 6 обработчиков, а это выливается в "объемистые" описания.

1 Листинг 25.2. Переопределение обработчиков сессии

<?

Возвращает полное имя файла временного хранилища сессии.

В случае, если нужно изменить тот каталог, в котором должна:

храниться сессии, достаточно поменять только эту функцию

function ses fname($key)

return "sessiondata/".session name()."/$key";

Заглушки - эти функции просто ничего не делают function ses open($save path, $ses name) { return true; } function ses close() { return true; }

Чтение данн1х из временного хранилища function ses read($key)

Получаем имя файла и откр1ваем файл $fname=ses fname($key);

$f=@fopen($fname,"rb"); if(!$f) return ""; Читаем до конца файла $st=fread($f,filesize($fname)); fclose($f); return $st;



Запись данн1х сессии во временное хранилище

function ses write($key, $val)

$fname=ses fname($key);

Сначала создаем все каталоги (в случае, если они уже есть, игнорируем сообщения об ошибке) @mkdir($d=dirname(dirname($fname)),0777); @mkdir(dirname($fname),0777);

Создаем файл и запис1ваем в него данн1е сессии

$f=@fopen($fname,"wb"); if(!$f) return "";

fwrite($f,$val);

fclose($f);

return true;

Выз1вается при уничтожении сессии function ses destroy ($key)

return @unlink(ses fname($key));

Сборка мусора - ищем все старые файл: и удаляем их function ses gc($maxlifetime)

$dir=ses fname(".");

Получаем доступ к каталогу текущей группа: сессии $d=@opendir($dir); if(!$d) return false;

$DelDir=1; Признак того, что каталог пуст, и его можно удалить Читаем все элементы каталога while(($e=readdir($d))!==false) {

Если это "точки", пропускаем их

if($e=="."$e=="..") continue;

Файл слишком стар1Й?

if(time()-filemtime($fname="$dir/$e")>=$maxlifetime) { @unlink($fname); continue;

Нашли не очень стар1Й файл - значит, каталог точно



не будет в результате работы пуст. $DelDir=0;

closedir($d);

Если все файл1 оказались слишком старые и удален:, удалить и каталог if($DelDir) @rmdir($dir); return true;

Регистрируем наши новые обработчики session set save handler(

"ses open", "ses close",

"ses read", "ses write",

"ses destroy", "ses gc"

Для примера подключаемся к группе сессий test

session name("test");

session start();

session register("count");

Дальше как обычно...

$count=@$count+1;

?>

<body>

<h2>Счетчик</h2>

В текущей сессии работы с браузером Вы открыли эту страницу <?=$count?> раз(а). Закройте браузер, чтобы обнулить этот счетчик. </body>

Сессии и Cookies

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



0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 [ 117 ] 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189