diff -r 000000000000 -r 4eba9c11703f web/Zend/Service/WindowsAzure/SessionHandler.php --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/Zend/Service/WindowsAzure/SessionHandler.php Mon Dec 13 18:29:26 2010 +0100 @@ -0,0 +1,217 @@ +_tableStorage = $tableStorage; + $this->_sessionTable = $sessionTable; + $this->_sessionTablePartition = $sessionTablePartition; + } + + /** + * Registers the current session handler as PHP's session handler + * + * @return boolean + */ + public function register() + { + return session_set_save_handler(array($this, 'open'), + array($this, 'close'), + array($this, 'read'), + array($this, 'write'), + array($this, 'destroy'), + array($this, 'gc') + ); + } + + /** + * Open the session store + * + * @return bool + */ + public function open() + { + // Make sure table exists + $tableExists = $this->_tableStorage->tableExists($this->_sessionTable); + if (!$tableExists) { + $this->_tableStorage->createTable($this->_sessionTable); + } + + // Ok! + return true; + } + + /** + * Close the session store + * + * @return bool + */ + public function close() + { + return true; + } + + /** + * Read a specific session + * + * @param int $id Session Id + * @return string + */ + public function read($id) + { + try + { + $sessionRecord = $this->_tableStorage->retrieveEntityById( + $this->_sessionTable, + $this->_sessionTablePartition, + $id + ); + return base64_decode($sessionRecord->serializedData); + } + catch (Zend_Service_WindowsAzure_Exception $ex) + { + return ''; + } + } + + /** + * Write a specific session + * + * @param int $id Session Id + * @param string $serializedData Serialized PHP object + */ + public function write($id, $serializedData) + { + $sessionRecord = new Zend_Service_WindowsAzure_Storage_DynamicTableEntity($this->_sessionTablePartition, $id); + $sessionRecord->sessionExpires = time(); + $sessionRecord->serializedData = base64_encode($serializedData); + + $sessionRecord->setAzurePropertyType('sessionExpires', 'Edm.Int32'); + + try + { + $this->_tableStorage->updateEntity($this->_sessionTable, $sessionRecord); + } + catch (Zend_Service_WindowsAzure_Exception $unknownRecord) + { + $this->_tableStorage->insertEntity($this->_sessionTable, $sessionRecord); + } + } + + /** + * Destroy a specific session + * + * @param int $id Session Id + * @return boolean + */ + public function destroy($id) + { + try + { + $sessionRecord = $this->_tableStorage->retrieveEntityById( + $this->_sessionTable, + $this->_sessionTablePartition, + $id + ); + $this->_tableStorage->deleteEntity($this->_sessionTable, $sessionRecord); + + return true; + } + catch (Zend_Service_WindowsAzure_Exception $ex) + { + return false; + } + } + + /** + * Garbage collector + * + * @param int $lifeTime Session maximal lifetime + * @see session.gc_divisor 100 + * @see session.gc_maxlifetime 1440 + * @see session.gc_probability 1 + * @usage Execution rate 1/100 (session.gc_probability/session.gc_divisor) + * @return boolean + */ + public function gc($lifeTime) + { + try + { + $result = $this->_tableStorage->retrieveEntities($this->_sessionTable, 'PartitionKey eq \'' . $this->_sessionTablePartition . '\' and sessionExpires lt ' . (time() - $lifeTime)); + foreach ($result as $sessionRecord) + { + $this->_tableStorage->deleteEntity($this->_sessionTable, $sessionRecord); + } + return true; + } + catch (Zend_Service_WindowsAzure_exception $ex) + { + return false; + } + } +}