CDbHttpSession
| Пакет | system.web |
|---|---|
| Наследование | class CDbHttpSession » CHttpSession » CApplicationComponent » CComponent |
| Реализует | Countable, ArrayAccess, Traversable, IteratorAggregate, IApplicationComponent |
| С версии | 1.0 |
| Исходный код | framework/web/CDbHttpSession.php |
CDbHttpSession хранит данные сессии в таблице базы данных с именем 'YiiSession'. Имя таблицы может быть изменено, установив свойство sessionTableName. Если таблицы не существует, она будет автоматически создана, если свойство autoCreateSessionTable установлено в значение true.
Вот структура таблицы:
CREATE TABLE YiiSession
(
id CHAR(32) PRIMARY KEY,
expire INTEGER,
data BLOB
)
Где 'BLOB' относится к типу BLOB в вашей базе данных. Обратите внимание, что если идентификаторы сессий содержат более 32 символов (может быть изменено с помощью session.hash_bits_per_character или session.hash_function), вам необходимо соответствующим образом изменить схему SQL.
CDbHttpSession использует PDO для доступа к базе данных.
По умолчанию он будет использовать базу данных SQLite3 с именем 'session-YiiVersion.db' в каталоге выполнения приложения. Вы также можете указать свойство connectionID, чтобы использовать компонент приложения базы данных для доступа к базе данных.
При использовании CDbHttpSession на сервере в производстве рекомендуется предварительно создать таблицу сессии базы данных и установить свойство autoCreateSessionTable в значение false. Это значительно улучшит производительность. Вы также можете создать индекс в базе данных для столбца 'expire' в таблице сессии для дальнейшего повышения производительности.
Общественные свойства
| Свойство | Тип | Описание | Определено |
|---|---|---|---|
| autoCreateSessionTable | boolean | указывает, должна ли таблица сессии базы данных автоматически создаваться, если она не существует. | CDbHttpSession |
| autoStart | boolean | указывает, должна ли сессия автоматически запускаться при инициализации компонента приложения сессии, по умолчанию true. | CHttpSession |
| behaviors | array | поведения, которые должны быть присоединены к этому компоненту. | CApplicationComponent |
| connectionID | string | идентификатор компонента приложения CDbConnection. | CDbHttpSession |
| cookieMode | string | способ использования cookie для хранения идентификатора сессии. | CHttpSession |
| cookieParams | array | параметры cookie сессии. | CHttpSession |
| count | integer | Возвращает количество элементов в сессии. | CHttpSession |
| gCProbability | float | вероятность (в процентах), что процесс gc (уборки мусора) запускается при каждой инициализации сессии, по умолчанию 1 (1% вероятность). | CHttpSession |
| isInitialized | boolean | Проверяет, был ли инициализирован этот компонент приложения. | CApplicationComponent |
| isStarted | boolean | указывает, была ли начата сессия. | CHttpSession |
| iterator | CHttpSessionIterator | Возвращает итератор для обхода переменных сессии. | CHttpSession |
| keys | array | список имен переменных сессии. | CHttpSession |
| savePath | string | текущий путь сохранения сессии, по умолчанию {@link http://php. | CHttpSession |
| sessionID | string | текущий идентификатор сессии. | CHttpSession |
| sessionName | string | текущее имя сессии. | CHttpSession |
| sessionTableName | string | имя таблицы базы данных для хранения содержимого сессии. | CDbHttpSession |
| timeout | integer | количество секунд, по истечении которого данные будут считаться 'мусором' и удалены, по умолчанию 1440 секунд. | CHttpSession |
| useCustomStorage | boolean | Возвращает значение, указывающее, использовать ли пользовательское хранилище сессии. | CDbHttpSession |
| useTransparentSessionID | boolean | включена ли поддержка прозрачного идентификатора сессии, по умолчанию false. | CHttpSession |
Защищенные свойства
| Свойство | Тип | Описание | Определено |
|---|---|---|---|
| dbConnection | CDbConnection | экземпляр подключения к базе данных | CDbHttpSession |
Публичные методы
| Метод | Описание | Определено в |
|---|---|---|
| __call() | Вызывает метод с заданным именем, который не является методом класса. | CComponent |
| __get() | Возвращает значение свойства, список обработчиков событий или поведение на основе его имени. | CComponent |
| __isset() | Проверяет, является ли значение свойства null. | CComponent |
| __set() | Устанавливает значение свойства компонента. | CComponent |
| __unset() | Устанавливает свойство компонента в null. | CComponent |
| add() | Добавляет переменную сессии. | CHttpSession |
| asa() | Возвращает объект поведения с заданным именем. | CComponent |
| attachBehavior() | Присоединяет поведение к данному компоненту. | CComponent |
| attachBehaviors() | Присоединяет список поведений к компоненту. | CComponent |
| attachEventHandler() | Присоединяет обработчик событий к событию. | CComponent |
| canGetProperty() | Определяет, можно ли считать свойство. | CComponent |
| canSetProperty() | Определяет, можно ли установить свойство. | CComponent |
| clear() | Удаляет все переменные сессии. | CHttpSession |
| close() | Завершает текущую сессию и сохраняет данные сессии. | CHttpSession |
| closeSession() | Обработчик закрытия сессии. | CHttpSession |
| contains() | CHttpSession | |
| count() | Возвращает количество элементов в сессии. | CHttpSession |
| destroy() | Освобождает все переменные сессии и уничтожает все данные, зарегистрированные в сессии. | CHttpSession |
| destroySession() | Обработчик уничтожения сессии. | CDbHttpSession |
| detachBehavior() | Отсоединяет поведение от компонента. | CComponent |
| detachBehaviors() | Отсоединяет все поведения от компонента. | CComponent |
| detachEventHandler() | Отсоединяет существующий обработчик событий. | CComponent |
| disableBehavior() | Отключает присоединенное поведение. | CComponent |
| disableBehaviors() | Отключает все поведения, присоединенные к этому компоненту. | CComponent |
| enableBehavior() | Включает присоединенное поведение. | CComponent |
| enableBehaviors() | Включает все поведения, присоединенные к этому компоненту. | CComponent |
| evaluateExpression() | Вычисляет PHP-выражение или обратный вызов в контексте данного компонента. | CComponent |
| gcSession() | Обработчик GC (сбор мусора) сессии. | CDbHttpSession |
| get() | Возвращает значение переменной сессии по имени переменной сессии. | CHttpSession |
| getCookieMode() | Возвращает способ использования cookie для хранения ID сессии. По умолчанию — 'Разрешить'. | CHttpSession |
| getCookieParams() | Возвращает параметры cookie сессии. | CHttpSession |
| getCount() | Возвращает количество элементов в сессии. | CHttpSession |
| getEventHandlers() | Возвращает список присоединенных обработчиков событий для события. | CComponent |
| getGCProbability() | Возвращает вероятность (в процентах) запуска процесса gc (сбора мусора) при каждой инициализации сессии, по умолчанию 1 (1% вероятность). | CHttpSession |
| getIsInitialized() | Проверяет, был ли инициализирован этот компонент приложения. | CApplicationComponent |
| getIsStarted() | Проверяет, началась ли сессия. | CHttpSession |
| getIterator() | Возвращает итератор для обхода переменных сессии. | CHttpSession |
| getKeys() | Возвращает список имен переменных сессии. | CHttpSession |
| getSavePath() | Возвращает текущий путь сохранения сессии, по умолчанию http://php.net/session.save_path. | CHttpSession |
| getSessionID() | Возвращает текущий ID сессии. | CHttpSession |
| getSessionName() | Возвращает текущее имя сессии. | CHttpSession |
| getTimeout() | Возвращает количество секунд, по истечении которых данные будут считаться «мусором» и удалены, по умолчанию 1440 секунд. | CHttpSession |
| getUseCustomStorage() | Возвращает значение, указывающее, следует ли использовать пользовательское хранилище сессии. | CDbHttpSession |
| getUseTransparentSessionID() | Возвращает, включена ли поддержка прозрачного SID, по умолчанию false. | CHttpSession |
| hasEvent() | Определяет, определено ли событие. | CComponent |
| hasEventHandler() | Проверяет, есть ли присоединенные обработчики для указанного события. | CComponent |
| hasProperty() | Определяет, определено ли свойство. | CComponent |
| init() | Инициализирует компонент приложения. | CHttpSession |
| itemAt() | Возвращает значение переменной сессии по имени переменной сессии. | CHttpSession |
| offsetExists() | Этот метод необходим для интерфейса ArrayAccess. | CHttpSession |
| offsetGet() | Этот метод необходим для интерфейса ArrayAccess. | CHttpSession |
| offsetSet() | Этот метод необходим для интерфейса ArrayAccess. | CHttpSession |
| offsetUnset() | Этот метод необходим для интерфейса ArrayAccess. | CHttpSession |
| open() | Инициализирует сеанс, если он ещё не начат. | CHttpSession |
| openSession() | Обработчик открытия сеанса. | CDbHttpSession |
| raiseEvent() | Вызывает событие. | CComponent |
| readSession() | Обработчик чтения сеанса. | CDbHttpSession |
| regenerateID() | Обновляет текущий идентификатор сеанса новым сгенерированным. | CDbHttpSession |
| remove() | Удаляет переменную сеанса. | CHttpSession |
| setCookieMode() | Устанавливает способ использования cookie для хранения ID сеанса. Допустимые значения: 'none', 'allow' и 'only'. | CHttpSession |
| setCookieParams() | Устанавливает параметры cookie сеанса. | CHttpSession |
| setGCProbability() | Устанавливает вероятность (в процентах), что процесс gc (уборки мусора) будет запущен при каждой инициализации сеанса. | CHttpSession |
| setSavePath() | Устанавливает текущий путь сохранения сеанса | CHttpSession |
| setSessionID() | Устанавливает идентификатор сеанса для текущего сеанса | CHttpSession |
| setSessionName() | Устанавливает имя сеанса для текущего сеанса, должно быть строкой из букв и цифр, по умолчанию PHPSESSID | CHttpSession |
| setTimeout() | Устанавливает количество секунд, после которого данные будут считаться 'мусором' и удалены. | CHttpSession |
| setUseTransparentSessionID() | Устанавливает, включена или выключена поддержка прозрачного sid. | CHttpSession |
| toArray() | CHttpSession | |
| writeSession() | Обработчик записи сеанса. | CDbHttpSession |
Защищенные методы
| Метод | Описание | Определено в |
|---|---|---|
| createSessionTable() | Создаёт таблицу базы данных для сеансов. | CDbHttpSession |
| getDbConnection() | Возвращает экземпляр подключения к базе данных. | CDbHttpSession |
Подробное описание свойств
autoCreateSessionTable свойство
public boolean $autoCreateSessionTable;
указывает, должна ли таблица базы данных сеансов автоматически создаваться, если её нет. По умолчанию true.
См. также
connectionID свойство
public string $connectionID;
идентификатор компонента приложения CDbConnection. Если не задан, будет автоматически создана и использована база данных SQLite. Файл базы данных SQLite находится по адресу protected/runtime/session-YiiVersion.db.
dbConnection свойство только для чтения
protected CDbConnection getDbConnection()
экземпляр подключения к базе данных
sessionTableName свойство
public string $sessionTableName;
имя таблицы базы данных для хранения содержимого сеанса. Обратите внимание, если autoCreateSessionTable равно false, и вы хотите создать таблицу базы данных вручную, вам необходимо убедиться, что таблица базы данных имеет следующую структуру:
(id CHAR(32) PRIMARY KEY, expire INTEGER, data BLOB)
См. также
useCustomStorage свойство только для чтения
public boolean getUseCustomStorage()
Возвращает значение, указывающее, использовать ли пользовательское хранилище сеанса. Этот метод переопределяет реализацию родительского класса и всегда возвращает true.
Подробное описание методов
createSessionTable() метод
protected void createSessionTable(CDbConnection $db, string $tableName) | ||
| $db | CDbConnection | подключение к базе данных |
| $tableName | string | имя таблицы, которая должна быть создана |
protected function createSessionTable($db,$tableName)
{
switch($db->getDriverName())
{
case 'mysql':
$blob='LONGBLOB';
break;
case 'pgsql':
$blob='BYTEA';
break;
case 'sqlsrv':
case 'mssql':
case 'dblib':
$blob='VARBINARY(MAX)';
break;
default:
$blob='BLOB';
break;
}
$db->createCommand()->createTable($tableName,array(
'id'=>'CHAR(32) PRIMARY KEY',
'expire'=>'integer',
'data'=>$blob,
));
}
Создаёт таблицу базы данных для сеансов.
destroySession() метод
public boolean destroySession(string $id) | ||
| $id | string | ID сеанса |
| {return} | boolean | успешно ли сеанс уничтожен |
public function destroySession($id)
{
$this->getDbConnection()->createCommand()
->delete($this->sessionTableName,'id=:id',array(':id'=>$id));
return true;
}
Обработчик уничтожения сеанса. Не вызывайте этот метод напрямую.
gcSession() метод
public boolean gcSession(integer $maxLifetime) | ||
| $maxLifetime | integer | количество секунд, после которого данные будут считаться 'мусором' и очищены. |
| {return} | boolean | успешно ли сеанс очищен от мусора |
public function gcSession($maxLifetime)
{
$this->getDbConnection()->createCommand()
->delete($this->sessionTableName,'expire<:expire',array(':expire'=>time()));
return true;
}
Обработчик gc (уборки мусора) сеанса. Не вызывайте этот метод напрямую.
getDbConnection() метод
protected CDbConnection getDbConnection() | ||
| {return} | CDbConnection | экземпляр подключения к базе данных |
protected function getDbConnection()
{
if($this->_db!==null)
return $this->_db;
elseif(($id=$this->connectionID)!==null)
{
if(($this->_db=Yii::app()->getComponent($id)) instanceof CDbConnection)
return $this->_db;
else
throw new CException(Yii::t('yii','CDbHttpSession.connectionID "{id}" is invalid. Please make sure it refers to the ID of a CDbConnection application component.',
array('{id}'=>$id)));
}
else
{
$dbFile=Yii::app()->getRuntimePath().DIRECTORY_SEPARATOR.'session-'.Yii::getVersion().'.db';
return $this->_db=new CDbConnection('sqlite:'.$dbFile);
}
}
getUseCustomStorage() метод
public boolean getUseCustomStorage() | ||
| {return} | boolean | использовать ли пользовательское хранилище. |
public function getUseCustomStorage()
{
return true;
}
Возвращает значение, указывающее, использовать ли пользовательское хранилище сеанса. Этот метод переопределяет реализацию родительского класса и всегда возвращает true.
openSession() метод
public boolean openSession(string $savePath, string $sessionName) | ||
| $savePath | string | путь сохранения сеанса |
| $sessionName | string | имя сеанса |
| {return} | boolean | успешно ли сеанс открыт |
public function openSession($savePath,$sessionName)
{
if($this->autoCreateSessionTable)
{
$db=$this->getDbConnection();
$db->setActive(true);
try
{
$db->createCommand()->delete($this->sessionTableName,'expire<:expire',array(':expire'=>time()));
}
catch(Exception $e)
{
$this->createSessionTable($db,$this->sessionTableName);
}
}
return true;
}
Обработчик открытия сеанса. Не вызывайте этот метод напрямую.
readSession() метод
public string readSession(string $id) | ||
| $id | string | ID сеанса |
| {return} | string | данные сеанса |
public function readSession($id)
{
$db=$this->getDbConnection();
if($db->getDriverName()=='sqlsrv' || $db->getDriverName()=='mssql' || $db->getDriverName()=='dblib')
$select='CONVERT(VARCHAR(MAX), data)';
else
$select='data';
$data=$db->createCommand()
->select($select)
->from($this->sessionTableName)
->where('expire>:expire AND id=:id',array(':expire'=>time(),':id'=>$id))
->queryScalar();
return $data===false?'':$data;
}
Обработчик чтения сеанса. Не вызывайте этот метод напрямую.
regenerateID() метод (доступен с версии v1.1.8)
public void regenerateID(boolean $deleteOldSession=false) | ||
| $deleteOldSession | boolean | Удалить ли старый связанный файл сессии. |
public function regenerateID($deleteOldSession=false)
{
$oldID=session_id();
// if no session is started, there is nothing to regenerate
if(empty($oldID))
return;
parent::regenerateID(false);
$newID=session_id();
$db=$this->getDbConnection();
$row=$db->createCommand()
->select()
->from($this->sessionTableName)
->where('id=:id',array(':id'=>$oldID))
->queryRow();
if($row!==false)
{
if($deleteOldSession)
$db->createCommand()->update($this->sessionTableName,array(
'id'=>$newID
),'id=:oldID',array(':oldID'=>$oldID));
else
{
$row['id']=$newID;
$db->createCommand()->insert($this->sessionTableName, $row);
}
}
else
{
// shouldn't reach here normally
$db->createCommand()->insert($this->sessionTableName, array(
'id'=>$newID,
'expire'=>time()+$this->getTimeout(),
'data'=>'',
));
}
}
Обновляет текущий идентификатор сессии новым сгенерированным. Подробнее см. http://php.net/session_regenerate_id.
writeSession() метод
public boolean writeSession(string $id, string $data) | ||
| $id | string | Идентификатор сессии |
| $data | string | Данные сессии |
| {return} | boolean | успешно ли выполнилось сохранение сессии |
public function writeSession($id,$data)
{
// exception must be caught in session write handler
// http://us.php.net/manual/en/function.session-set-save-handler.php
try
{
$expire=time()+$this->getTimeout();
$db=$this->getDbConnection();
if($db->getDriverName()=='pgsql')
$data=new CDbExpression($db->quoteValueWithType($data, PDO::PARAM_LOB)."::bytea");
if($db->getDriverName()=='sqlsrv' || $db->getDriverName()=='mssql' || $db->getDriverName()=='dblib')
$data=new CDbExpression('CONVERT(VARBINARY(MAX), '.$db->quoteValue($data).')');
if($db->createCommand()->select('id')->from($this->sessionTableName)->where('id=:id',array(':id'=>$id))->queryScalar()===false)
$db->createCommand()->insert($this->sessionTableName,array(
'id'=>$id,
'data'=>$data,
'expire'=>$expire,
));
else
$db->createCommand()->update($this->sessionTableName,array(
'data'=>$data,
'expire'=>$expire
),'id=:id',array(':id'=>$id));
}
catch(Exception $e)
{
if(YII_DEBUG)
echo $e->getMessage();
// it is too late to log an error message here
return false;
}
return true;
}
Обработчик записи сессии. Не вызывать этот метод напрямую.
© 2008–2017 by Yii Software LLC
Licensed under the three clause BSD license.
http://www.yiiframework.com/doc/api/1.1/CDbHttpSession