САМОУЧИТЕЛЬ PHP 4

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


Давайте напишем пример, который бы иллюстрировал механизм переопределения обработчиков. Мы будем держать временные хранилища сессий в подкаталоге 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>

Содержание раздела