РНР 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 дочернее окно браузера</а>.




  Hostland.Ru

 «Бесплатный хостинг Hostland.Su» © 2006