Let's have a look at an actual custom session backend. This uses MySQL to store the session data. We could set these right in the script, but let's make use of Apache's httpd.conf file to set our custom save handler for a portion of our web site.

<Directory "/var/html/test">
    php_value session.save_handler user
    php_value session.save_path mydb
    php_value session.name sessions
</Directory>
The MySQL schema looks like this:
CREATE TABLE sessions (
	id char(32) NOT NULL,
	data text,
	ts timestamp,
	PRIMARY KEY (id)
)
We can now write our handler. It looks like this:
<?php
function open($db,$name) {
    global 
$table;
    
mysql_connect('localhost');
    
mysql_select_db($db);
    
$table $name;
    return 
true;
}

function 
close() {
    
mysql_close();
    return 
true;
}

function 
read($id) {
    global 
$table;
    
$result mysql_query("select data from $table where id='$id'");
    if(
$result && mysql_num_rows($result)) {
        return 
mysql_result($result,0);
    } else {
        
error_log("read: ".mysql_error()."\n",3,"/tmp/errors.log");
        return 
"";
    }
}

function 
write($id$data) {
    global 
$table;
    
$data addslashes($data);
    
mysql_query("replace into $table (id,data) values('$id','$data')"
        or 
error_log("write: ".mysql_error()."\n",3,"/tmp/errors.log");
    return 
true;
}

function 
destroy($id) {
    global 
$table;
    
mysql_query("delete from $table where where id='$id'"); 
}

function 
gc($max_time) {
    global 
$table;
    
mysql_query(
      
"delete from $table where UNIX_TIMESTAMP(ts)<UNIX_TIMESTAMP()-$max_time"
      or 
error_log("gc: ".mysql_error()."\n",3,"/tmp/errors.log");
    return 
true;
}

session_set_save_handler('open','close','read','write','destroy','gc');
?>
Our PHP files under /var/html/test then simply need to look something like this:

<?php
  
require 'handler.php';

  
session_start();
  
session_register('var');
  
$var "Hello World";
?>