Voor
Family Tree PHP stapte ik een tijd geleden over van de MySql-extensie naar de MySqli-extensie van PHP. Eén van de problemen die ik daarbij tegenkwam, was dat de sessies opeens niet meer werden opgeslagen. Het duurde even voor ik door had waar dat aan lag.
Al eerder had ik de manier waarop PHP standaard sessies opslaat zodanig aangepast, dat de sessies nu in de database werden opgeslagen. Met de MySql-extensie werkte dat zonder problemen, maar bij de MySqli-extensie ging dat in eerste instantie fout.
Nu gebruikte ik de object-georiënteerde versie van MySqli. Daardoor functioneerde MySqli als een class en daar bleek uiteindelijk het probleem te zitten. De class werd door PHP afgesloten voordat PHP probeerde om de sessie op te slaan. Het gevolg was dat toen de sessie opgeslagen moest worden, de databaseverbinding al gesloten was en de sessie dus niet meer kon worden opgeslagen.
De oplossing was om zelf aan het einde van het script expliciet aan te geven dat PHP de sessie moet opslaan, zodat dit gebeurt voordat de databaseverbinding wordt gesloten. Hiervoor is de functie session_write_close();
Maar nu ontstond er een nieuw probleem. Her en der in het script gebruikte ik exit() of die() om de werking voortijdig te stoppen. In die al gevallen moest ik nu ook handmatig de sessie laten opslaan, omdat anders het oude probleem bleef bestaan.
Daarvoor maakte ik mijn eigen functie stop():
function stop($message = '') {
session_write_close();
exit($message);
}
Door nu
exit("bericht");
te vervangen door
stop("bericht");
werkte alles weer naar behoren.
Reacties