РНР 5 в подлинникеСтраница 283 из 554 |
||
|
Гпава 29. Управление сессиями 571 Но возникает вопрос: как же тогда РНР их найдет? Вот для этого и существует функция регистрации обработчиков, которая говорит интерпретатору, какую функцию он должен вызывать при наступлении того или иного события. void session_set_save_handler($орел, $close, $read, $write, $desfcroy, $gc) Эта функция регистрирует процедуры, имена которых переданы в ее параметрах, как обработчики текущей сессии. Параметр $ореп содержит имя функции, которая будет вызвана при инициализации сессии, a $ciose — функции, вызываемой при ее закрытии. В $read и $write нужно указать имена обработчиков, соответственно, для чтения и записи во временное хранилище. Функция с именем, заданным в $destroy, будет вызвана при уничтожении сессии. Наконец, обработчик, определяемый параметром $дс, используется как сборщик мусора. Эту функцию можно вызывать только до инициализации сессии (до session_start()), в противном случае она просто игнорируется. Пример: переопределение обработчиков Давайте напишем пример, который бы иллюстрировал механизм переопределения обработчиков. Мы будем держать временные хранилища сессий в подкаталоге sessiondata текущего каталога, и для каждого имени группы сессий создавать отдельный каталог. Код листинга 29.5 довольно велик, но не сложен. Тут уж ничего не поделаешь — нам в любом случае приходится задавать все шесть обработчиков, а это выливается в "объемистые" описания. ! Листинг 29.5. Файл handlers.php <?php ## Переопределение обработчиков сессии. // Возвращает полное имя файла временного хранилища сессии. // В случае, если нужно изменить тот каталог, в котором должны // храниться сессии, достаточно поменять только эту функцию function sеs_fname($key) { return dirname)_FILE_)."/sessiondata/".session_name()."/$key"; } // Заглушки — эти функции просто ничего не делают function ses_open($save_path, $ses_name) { return true; } function ses_close() { return true; } // Чтение данных из временного хранилища function ses_read($key) { // Получаем имя файла и открываем файл. $fname = ses_fname ($key) ; return @file_get_contents($fname); } // Запись данных сессии во временное хранилище function ses_write($key, $val) { $fname = ses_fname($key) ; 572 Часть IV. Стандартные функции РНР II Сначала создаем все каталоги (если они уже есть, // игнорируем сообщения об ошибке) @mkdiг(dirname(dirname($fname) ) , 0777); @mkdir(dirname($fname), 0777); // Создаем файл и записываем в него данные сессии. @file_put_contents($fname, $val); return true; } // Вызывается при уничтожении сессии function ses_destroy($key) { return @unlink(ses_fname($key)) ; } // Сборка мусора — ищем все старые файлы и удаляем их function ses_gc($maxlifetime) { $dir = ses_fname("."); // Получаем доступ к каталогу текущей группы сессии, foreach (glob("$dir/*") as $fname) ( // Файл слишком старый? if (time() — filemtime($fname) >= $maxlifetime) { @unlink($fname); continue; } } // Если каталог не пуст, он не удалится — будет предупреждение. // Мы его подавляем. Если же пуст — удалится, что нам и нужно. @rmdir($dir); return true; } // Регистрируем наши новые обработчики session_set_save_handler( "ses_open", "ses_close", "ses_read", "ses_write", "ses_destroy", "ses_gc" ); // Для примера подключаемся к группе сессий test. session_name("testl"); session_start(); // Увеличиваем счетчик в сессии. $_SESSION['count'] = @$_SESSION['count'] + 1; ?> <п2>Счетчик</п2> В текущей сессии работы с браузером Вы открыли эту страницу <?=$_SESSION['count']?> раз(а).<br> Закройте браузер, чтобы обнулить счетчик.<br> <а href="<?=$_SERVER[' SCRIPT_N7AME' ] ?>" target="_blank">OTKpbiTb дочернее окно браузера</а>. |
| |
|
В начало ←предыдущая следующая→ ... 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 ... | ||