¿Cómo guardo los datos de sesión en una base de datos en lugar de en el sistema de archivos?

Tengo dos sitios web, uno es TLS y otro no, ambos son para el mismo cliente, pero necesito que los sitios web compartan entre sí (y solo entre sí) datos comunes paralos usuarios, pedidos, cuentas etc.

Esto normalmente se haría con$_SESSION datos, pero obviamente estos no pueden funcionar en otros sitios, y he descubierto que puedo almacenar datos de sesión en una base de datos (MySQL) en lugar de en el sistema de archivos.

He cavado y encontradoEsta útil guía así como este más viejo peroguía útil. Yo tambien encontreesta guia que tiene MySQL un poco más actualizado.

He escrito una clase de interfaz pero solo funciona en parte, almacena los datos de la sesión en la base de datos, pero no la recupera. También he usado elmétodo sugerido del manual de PHP.

Mi MySQL (tal como se copió del primer par de enlaces anteriores):

CREATE TABLE `sessions` (
  `id` varchar(32) COLLATE utf8_unicode_ci NOT NULL,
  `access` int(10) NOT NULL,
  `data` text COLLATE utf8_unicode_ci NOT NULL,
  UNIQUE KEY `id` (`id`)
) ENGINE=InnoDb DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

Tenga en cuenta: Antes de mostrarle mi clase de interfaz, sepa que la conexión Db utiliza mi propia interfaz personalizada y que funciona perfectamente, en sí misma.

los$sessionDBconnectionUrl contiene los detalles de conexión de la base de datos de sesiones, ya que mantengo las sesiones en una base de datos separada de los contenidos principales del sitio web.

Mi clase de interfaz (según todos los enlaces anteriores)

<?php
/***
 * Created by PhpStorm.
 ***/
class HafSessionHandler implements SessionHandler {
    private $database = null;

    public function __construct($sessionDBconnectionUrl){

        if(!empty($sessionDBconnectionUrl) && file_exists($_SERVER['DOCUMENT_ROOT'].$sessionDBconnectionUrl)) {
            require_once "class.dataBase.php";
            // Instantiate new Database object
            $this->database = new Database($sessionDBconnectionUrl);
        }
        else {
            error_log("Session could not initialise class.");
        }

    }

    /**
     * Open
     */
    public function open($savepath, $id){
         $openRow = $this->database->getSelect("SELECT `data` FROM sessions WHERE id = ? LIMIT 1",$id);
    if($this->database->selectRowsFoundCounter() == 1){
        // Return True
        return $openRow['data'];
        },
    else {
        // Return False
        return ' ';
    }
    /**
     * Read
     */
    public function read($id)
    {
        // Set query
        $readRow = $this->database->getSelect('SELECT `data` FROM sessions WHERE id = ? LIMIT 1', $id,TRUE);
        if ($this->database->selectRowsFoundCounter() > 0) {
            return $readRow['data'];
        } else {
            error_log("could not read session id ".$id);
            return '';
        }
    }

    /**
     * Write
     */
    public function write($id, $data)
    {
        $access = time();
        // Set query
        $dataReplace[0] = $id;
        $dataReplace[1] = $access;
        $dataReplace[2] = $data;
        if ($this->database->noReturnQuery('REPLACE INTO sessions(id,access,`data`) VALUES (?, ?, ?)', $dataReplace)) {
            return TRUE;
        } else {
            return FALSE;
        }
    }

    /**
     * Destroy
     */
    public function destroy($id)
    {
        // Set query
        if ($this->database->noReturnQuery('DELETE * FROM sessions WHERE id = ? ', $id)) {
            return TRUE;
        } else {

            return FALSE;
        }
    }
    /**
     * Close
     */
    public function close(){
        // Close the database connection
        // If successful
        if($this->database->dbiLink->close){
            // Return True
            return true;
        }
        // Return False
        return false;
    }

    /**
     * Garbage Collection
     */
    public function gc($max)
    {
        // Calculate what is to be deemed old
        $old = time() - $max;

        // Set query
        if ($this->database->noReturnQuery('DELETE * FROM sessions WHERE access < ?', $old)) {
            return TRUE;
        } else {
            return FALSE;
        }
    }

    public function __destruct()
    {
        $this->close();
    }

}

Mi página de prueba (escrito desde cero!)

<?php
require "class.sessionHandler.inc.php";
$HSH = new HafSessionHandler("connection.session.dbxlink.php");
session_set_save_handler( $HSH, TRUE );
session_start();

print "<p>Hello this is an index page</p>";
$_SESSION['horses'] = "treesx3";
$_SESSION['tiespan'] = (int)$_SESSION['tiespan']+7;

print "<p>There should be some session data in the database now. <a href='index3.php'>link</a></p>";
var_dump($_SESSION);


exit;

Problema:

Las páginas de prueba que ejecuto guardan los datos en la base de datos, pero no parecen recuperar los datos,

Tengo habilitado el registro de errores y no se informan errores de PHP. No se informan errores críticos de MySQL.

¿Por qué no funciona?

Respuestas a la pregunta(1)

Su respuesta a la pregunta