Como salvar os dados da sessão em um banco de dados em vez de no sistema de arquivos?
Eu tenho dois sites, um é TLS e um não, ambos são para o mesmo cliente, mas preciso que os sites compartilhem uns com os outros (e somente uns com os outros) dados comuns paraComercial, pedidos, contas etc.
Isso normalmente seria feito com$_SESSION
dados, mas obviamente eles não podem funcionar em outros sites e descobri que posso armazenar dados de sessão em um banco de dados (MySQL) e não no sistema de arquivos.
Eu procurei e encontreiEste guia útil bem como este mais velho, masguia útil. Eu também encontreieste guia que tem um pouco mais atualizado MySQL.
Eu escrevi uma classe de interface, mas funciona apenas parcialmente, armazena os dados da sessão no banco de dados, mas não os recupera. Eu também usei ométodo sugerido no manual do PHP.
My MySQL (conforme copiado dos primeiros links acima):
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;
Observe: Antes de mostrar minha classe de interface, saiba que a conexão Db usa minha própria interface personalizada e que funciona perfeitamente por si só.
o$sessionDBconnectionUrl
contém os detalhes da conexão do banco de dados da sessão, enquanto eu mantenho sessões em um banco de dados separado do conteúdo principal do site.
Minha classe de interface (com base em todos os links acima)
<?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();
}
}
Minha Página de Teste (escrito do zero!)
<?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;
Questão:
As páginas de teste que eu corro salvam os dados no banco de dados, mas eles não parecem recuperar os dados,
Tenho o log de erros ativado e nenhum erro PHP é relatado. Nenhum erro crítico do MySQL é relatado.
Por que isso não funciona?