hallo,

ik heb een probleem met mijn custom session handler die gebaseerd is op een artikel te vinden op:
http://shiflett.org/articles/storing-sessions-in-a-database

mijn probleem is niet zozeer dat het niet werkt, maar het werkt in de verkeerde volgorde...

ok komt tie aan:

<?PHP
include('mysql.php');
include('session_handler.php'); // dit is een class

$link = new mysql('host','user','pass','session_db');

// doe hier andere dingen die altijd in het begin van je php pagina doet.
// bv. set custom php ini dingen

CSH = new session_handler(); // Custom Session Handler

$_SESSION['test'] = 'ik ben jantje';
$_SESSION['abcde'] = 'dit is een test';

$link->close();
?>

Onderaan in het kort de session_handler:

ok het probleem is nu dat $link->close(); wordt uitgevoerd voordat de session handler de variabelen in de db wegschrijft....

beetje wazig aangezien de $_SESSION variabelen voooooor close() worden uitgevoerd.

nu is het zo dat ik een error krijg in de session class waaruit blijkt dat er geen mysql verbinding is....

haal ik $link->close(); weg dan werkt alles zoals het moet.
de variabelen worden netjes weg geschreven en geen error.

conclusie: de database link wordt gesloten voordat de session handler de kans heeft om de variabelen weg te schrijven...

terwijl $link->close(); daarna ( als allerlaatste ) wordt uitgevoerd...

iemand een idee?


<?PHP
class session_handler
{
function session_handler()
{
session_set_save_handler(
array($this, '_open'),
array($this, '_close'),
array($this, '_read'),
array($this, '_write'),
array($this, '_destroy'),
array($this, '_clean')
);

session_start();
}

function _open()
{

}

function _close()
{

}

function _read()
{

}

function _write()
{

}

function _destroy()
{

}

function _clean()
{

}
}
?>
de sessie wordt aan het einde van het script opgeslagen. Dat is op zich wel ok, zo kan je immers gewoon bewerkingen doen op de SESSION array zonder dat hij bij iedere toewijzing dingen in de database gaat opslaan.

Ik zie eigenlijk maar 3 mogelijkheden:
1. Je lsaat de sessie op voor/tijdens het sluiten van de database. Je maakt van de _write method dan gewoon een dummy-functie die niets doet, en roept zelf handmatig de write-functie op. Maar dan moet je wel zelf het serialize-gebeuren doen. Maar dat zou niet echt een probleem moeten zijn. Dit zou je eventueel via een soort van callback of events-mechanisme kunnen doen.

2. Je laat de database zichzelf sluiten. Gewoon laten afhandelen door PHP zelf.

3. Je gebruikt een 2e database-connectie alleen voor de session-handler. En die verbinding blijft binnen de session-handler en wordt verder niet door je script gebruikt. Je maakt de session-handler verantwoordelijk voor het openen en opruimen van z'n connectie.
jelmer bedankt voor je bericht.

de eerste snap ik, het nut van heel de handler gaat misschien wel wat verloren. maar dat zou op zich wel moeten werken.

je tweede optie snap ik niet zo goed. gewoon helemaal geen close() doen?

optie 3 kan niet.

het zit namelijk zo:
in de index.php maak ik al een connectie aan
en in de handler zou ik dan gerust nog een connectie kunnen maken, maar..

zodra mysql_connect een connectie tegen komt met dezelfde credentials ( host, username, ww, db ) dan neemt mysql deze verbinding over. oftewel als ik deze dan weer sluit ( in de $session->_close() ) dan wordt dus de algemene verbinding gesloten.

info:

http://nl.php.net/manual/en/function.mysql-connect.php
en dan de beschrijving van de vierde parameter: new_link

alvast bedankt.

ik weet nu wel wat er gebeurd. en waarom. het is opzich best wel logisch dat de session data wordt afgehandeld als heel de pagina klaar is met zijn uitvoering!
ok, my bad. optie drie kan wel.
ik heb alleen de vierde parameter niet goed begrepen.
nu wel dus.. sorry! :$

ik heb nu de session handler zijn eigen db connectie gegeven.
Niet Bumpen.
Bumpen:
Twee of meer keer achter elkaar in een topic posten heet bumpen. Bumpen is pas na 24 uur toegestaan en kan een reden zijn voor de admins en moderators om een topic te sluiten. Gebruik indien nodig de knop om je tekst aan te passen.
Dan zou ik uiteindelijk voor optie 3 gaan. Ik denk dat die het netste is. Mede doordat je session-handler zo eigenlijk volledig los van de rest van de code & database komt te staan. Je kan dan voor je sessies bijvoorbeeld weer een compleet ander type, of bijvoorbeeld een presistant connection gebruiken. Daarvoor hoef je dan de rest van de applicatie niet meer aan te passen.

Reageren