Hi! I'm already using my own class for PageStatePersister, and a performance of all request is now much higher (especially AJAX - about 1000% incrise)!
I must say, that TSessionPageStatePersister has many disadvantages (e.g. is unable to store pagestates for multiple pages by user).
I have no time for writing "ready for use" component, but maybe my code will help someone to write it.
Database shema:
CREATE TABLE `page_states` (
`id` int(11) NOT NULL auto_increment,
`timestamp` int(11) NOT NULL,
`data` longtext collate utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`),
KEY `timestamp` (`timestamp`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=867 ;
Class:
<?php
class UPageStatePersister extends TComponent implements IPageStatePersister
{
private $_page;
/**
* @return TPage the page that this persister works for
*/
public function getPage()
{
return $this->_page;
}
/**
* @param TPage the page that this persister works for
*/
public function setPage(TPage $page)
{
$this->_page=$page;
}
/**
* Saves state in hidden fields.
* @param mixed state to be stored
*/
public function save($state)
{
$db = PRADO::getApplication()->getDB();
$dataAsString = serialize($state);
$db->execute("INSERT INTO page_states(timestamp,data) VALUES(:timestamp,:data)",
array('timestamp' => time(), 'data' => $dataAsString));
$pageStateNumber = $db->getLastInsertID();
$this->_page->setClientState($pageStateNumber);
}
/**
* Loads page state from hidden fields.
* @return mixed the restored state
* @throws THttpException if page state is corrupted
*/
public function load()
{
$db = PRADO::getApplication()->getDB();
$db->execute("DELETE FROM page_states WHERE timestamp < :timestamp",
array('timestamp' => (time()-60*60*2)));
$data = null;
$pageStateNumber = $this->_page->getRequestClientState();
if(strlen($pageStateNumber) > 0)
{
$dbResult = $db->execute("SELECT data FROM page_states WHERE id=:id LIMIT 0,1",
array('id' =>$pageStateNumber));
if($dbResult->getRowCount() > 0)
{
$dbArray = $dbResult->read();
$data = unserialize($dbArray['data']);
}
}
if($data!==null)
return $data;
else
throw new THttpException(400,'pagestatepersister_pagestate_corrupted');
}
}
?>