©
本文档使用 PHP中文网手册 发布
(PHP 5 >= 5.4.0)
SessionHandlerInterface is an interface which defines a prototype for creating a custom session handler. In order to pass a custom session handler to session_set_save_handler() using its OOP invocation, the class must implement this interface.
Please note the callback methods of this class are designed to be called internally by PHP and are not meant to be called from user-space code.
$session_id
)$maxlifetime
)$save_path
, string $name
)$session_id
)$session_id
, string $session_data
)Example #1 Example using SessionHandlerInterface
The following example provides file based session storage similar to the
PHP sessions default save handler files
. This
example could easily be extended to cover database storage using your
favorite PHP supported database engine.
Note we use the OOP prototype with session_set_save_handler() and register the shutdown function using the function's parameter flag. This is generally advised when registering objects as session save handlers.
<?php
class MySessionHandler implements SessionHandlerInterface
{
private $savePath ;
public function open ( $savePath , $sessionName )
{
$this -> savePath = $savePath ;
if (! is_dir ( $this -> savePath )) {
mkdir ( $this -> savePath , 0777 );
}
return true ;
}
public function close ()
{
return true ;
}
public function read ( $id )
{
return (string)@ file_get_contents ( " $this -> savePath /sess_ $id " );
}
public function write ( $id , $data )
{
return file_put_contents ( " $this -> savePath /sess_ $id " , $data ) === false ? false : true ;
}
public function destroy ( $id )
{
$file = " $this -> savePath /sess_ $id " ;
if ( file_exists ( $file )) {
unlink ( $file );
}
return true ;
}
public function gc ( $maxlifetime )
{
foreach ( glob ( " $this -> savePath /sess_*" ) as $file ) {
if ( filemtime ( $file ) + $maxlifetime < time () && file_exists ( $file )) {
unlink ( $file );
}
}
return true ;
}
}
$handler = new MySessionHandler ();
session_set_save_handler ( $handler , true );
session_start ();
// proceed to set and retrieve values by key from $_SESSION
[#1] StanE [2015-11-02 19:46:30]
I think there is a small "error" in the example of the class MySessionHandler in method gc(). It uses the function filemtime() whose return value is cached by PHP. Add the following line inside the foreach block in the gc() method:
clearstatcache(true, $file);
[#2] avenidagez at foro5 dot com [2014-12-06 03:54:48]
Note that session_start( ) calls open then read and the class returns true for open and the value of session or empty for read.
Well, then there is no catch for errors, this is, session_start() must return false on failure, but that is not the case for the class implementation on method open, no matter if you return true or false or whatever from open, it is ignored by session_start() function and proceeds to read method
A bug?, if open returns false, session_start() should stop the next step (read) and return itself false
if(session_start()) ...code
else exit( );
So forget about session_start() return value, you need to implement an error catch routine and exit() in case of failure on open method
[#3] warxcell at gmail dot com [2012-09-21 23:12:42]
You should prepend <b>\</b> before class name, to tell php its from root namespace.
[#4] PHPaficionado [2012-06-29 05:07:50]
This interface like classes doesn't show up if you have a namespace defined.
If you're getting an error like:
Fatal error: Interface 'MyNamespace\SessionHandlerInterface' not found
under your namespace you can just write the line:
use SessionHandlerInterface;
and all will be fine.
You can now implement this interface as usual.