Poniżej zamieszczam, metodę write() z mojego handlera sesji. Problem w tym, że najpierw następuje próba dodania nowego rekordu do bazy, a jeśli okaże się, że zwracany jest błąd = już taki identyfikator sesji został zapisany do bazy, to jest ona updejtowana. Próbowałem najpierw updejtować rekord a w przypadku wyrzucenia wyjątku wstawiać nowy, ale jeśli nastąpią 2 wywołania w ciągu 1 sekundy dla tego samego użytkownika (mało lecz prawdopodobne) to zwracany jest wyjątek. Dzieje się tak dlatego, że dwa wywołania w ciągu sekundy = brak nowych danych do zapisu i mysql zwraca 0 przetworzonych wierszy = dodanie nowego wpisu do bazy. Z tego też powodu musiałem na razie pozostać przy poniższym rozwiązaniu.. Poniższy sposób działa prawidłowo, ale przy większej aplikacji może wpłynąć na wydajność. A nawet jeśli nie wpłynie na wydajność to mało elegancko wygląda. Za każdym razem próbować dodawać nowy rekord tylko po to żeby stwierdzić czy rzeczywiście należy dodać nowy czy może tylko updejtować.. Macie jakiś pomysł jak to poprawić?
<?php
/**
* Metoda wywoływana przy każdej próbie zmiany lub dodania elementu do tablicy
* asocjacyjnej $_SESSION.
*
* @param string $sSessionIdentifier Identyfikator sesji
* @param string $sSessionValues Zserializowana reprezentacja tablicy $_SESSION
* @return bool
*/
public function write($sSessionIdentifier, $sSessionValues)
{
$this->sLastTime = date("Y-m-d G:i:s"); $this->sSessionValues = $sSessionValues;
try
{
$aInsert = array('session_identifier' => $this->sSessionIdentifier, 'session_time_start' => $this->sTimeStart, 'session_last_time' => $this->sLastTime, 'address_ip' => $this->sAddressIP, 'login' => 'NULL',
'session_values' => $sSessionValues);
$this->oConnection->insert('sessions', $aInsert);
}
catch (MysqlException $e)
{
try
{
$aUpdate = array('session_last_time' => $this->sLastTime, 'session_values' => $this->sSessionValues);
$this->oConnection->update('sessions', $aUpdate, 'session_identifier = '' . $sSessionIdentifier . ''');
}
catch (MysqlException $e)
{
}
}
return true;
}
?>