переопределение обработчиков
Давайте напишем пример, который бы иллюстрировал механизм переопределения обработчиков. Мы будем держать временные хранилища сессий в подкаталоге sessiondata
текущего каталога, и для каждого имени группы сессий создавать отдельный каталог.
Код листинга 25.2 довольно велик, но не сложен. Тут уж ничего не поделаешь— нам в любом случае приходится задавать все 6 обработчиков, а это выливается в "объемистые"
описания.
Листинг 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; }
// ×òåíèå äàííûõ èç âðåìåííîãî õðàíèëèùà
function ses_read($key)
{
// Ïîëó÷àåì èìÿ ôàéëà è îòêðûâàåì файл
$fname=ses_fname($key);
$f=@fopen($fname,"rb"); if(!$f) return "";
// ×èòàåì äî êîíöà ôàéëà
$st=fread($f,filesize($fname));
fclose($f);
return $st;
}
// Çàïèñü äàííûõ ñåññèè âî âðåìåííîå õðàíèëèùå
function ses_write($key, $val)
{
$fname=ses_fname($key);
// Ñíà÷àëà ñîçäàåì âñå каталоги (â ñëó÷àå, åñëè îíè óæå åñòü,
// èãíîðèðóåì ñîîáùåíèÿ îá îøèáêå)
@mkdir($d=dirname(dirname($fname)),0777);
@mkdir(dirname($fname),0777);
// Ñîçäàåì ôàéë è çàïèñûâàåì â íåãî äàííûå ñåññèè
$f=@fopen($fname,"wb"); if(!$f) return "";
fwrite($f,$val);
fclose($f);
return true;
}
// Âûçûâàåòñÿ ïðè óíè÷òîæåíèè ñåññèè
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;
// Ôàéë ñëèøêîì ñòàðûé?
if(time()-filemtime($fname="$dir/$e")>=$maxlifetime) {
@unlink($fname);
continue;
}
// Íàøëè íå î÷åíü ñòàðûé ôàéë — çíà÷èò, каталог òî÷íî
// íå áóäåò â ðåçóëüòàòå ðàáîòû ïóñò.
$DelDir=0;
}
closedir($d);
// Åñëè âñå ôàéëû îêàçàëèñü ñëèøêîì ñòàðûå è óäàëены,
// óäàëèòü è каталог
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>