如何使用PdoSessionHandler存储会话在数据库中
编辑本页警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 3.4,现已不再维护。
读本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。
如何使用PdoSessionHandler存储会话在数据库中
默认的Symfony会话ob娱乐下载存储将会话信息写入文件。大多数中型到大型网站使用数据库来存储会话值,而不是文件,因为数据库更容易在多个web服务器环境中使用和扩展。
ob娱乐下载Symfony有一个内置的数据库会话存储解决方案,称为PdoSessionHandler.要使用它,首先注册一个新的处理程序服务:
- YAML
- XML
- PHP
1 2 3 4 5 6 7 8 9
# app / config / config.yml服务:#……ob娱乐下载Symfony \ HttpFoundation \会议\ \组件存储\处理器\ PdoSessionHandler:公众:假参数:-“mysql: dbname = mydatabase;主机=并且;端口= myport '-{db_username:myuser,db_password:我的密码}
提示
将数据库凭证配置为用环境变量定义的参数使您的应用程序更安全。
接下来,告诉Symfoob娱乐下载ny使用您的服务作为会话处理程序:
- YAML
- XML
- PHP
1 2 3 4 5
# app / config / config.yml框架:会话:#……handler_id:ob娱乐下载Symfony \组件\ HttpFoundation \会议\ \ PdoSessionHandler存储\处理程序
配置表名和列名
这需要一个会话
表中有许多不同的列。表名和所有列名可以通过传递第二个数组参数来配置PdoSessionHandler
:
- YAML
- XML
- PHP
1 2 3 4 5 6 7 8 9
# app / config / config.yml服务:#……ob娱乐下载Symfony \ HttpFoundation \会议\ \组件存储\处理器\ PdoSessionHandler:公众:假参数:-“mysql: dbname = mydatabase;主机=并且;端口= myport '-{db_table:“会话”,db_username:“myuser”,db_password:“我的密码”}
这些是你可以配置的参数:
-
db_table
(默认会话
): - 数据库中会话表的名称;
-
db_id_col
(默认sess_id
): - 会话表中id列的名称(VARCHAR(128));
-
db_data_col
(默认sess_data
): - 会话表中值列的名称(BLOB);
-
db_time_col
(默认sess_time
): - 会话表中时间列的名称(INTEGER);
-
db_lifetime_col
(默认sess_lifetime
): - 会话表中生存期列的名称(INTEGER)。
共享数据库连接信息
对于给定的配置,数据库连接设置仅为会话存储连接定义。当您为会话数据使用单独的数据库时,这是可以的。
但是,如果希望将会话数据存储在与项目其他数据相同的数据库中,则可以使用parameters.yml
文件中定义的数据库相关参数:
- YAML
- XML
- PHP
1 2 3 4 5 6 7 8
服务:#……ob娱乐下载Symfony \ HttpFoundation \会议\ \组件存储\处理器\ PdoSessionHandler:公众:假参数:-“mysql:主机= % database_host %;端口= % database_port %; dbname = % database_name % '-{db_username:“% database_user %”,db_password:“% database_password %”}
准备数据库存储会话
在数据库中存储会话之前,必须创建存储信息的表。会话处理程序提供了一个方法不知道()根据所使用的数据库引擎设置此表:
1 2 3 4 5
试一试{$sessionHandlerService->不知道();}抓(\ PDOException$异常) {//由于某些原因无法创建表}
如果您喜欢自己设置表,则可以根据特定的数据库引擎使用一些SQL语句示例。
MySQL
1 2 3 4 5 6
创建表格“会话”(“sess_id”VARCHAR(128)不零主要的关键,“sess_data”团不零,“sess_time”整数无符号不零,“sess_lifetime”整数无符号不零)核对utf8mb4_bin,引擎=InnoDB;
请注意
一个团
列类型最多只能存储64 kb。如果存储在用户会话中的数据超过了这个值,则可能引发异常或静默重置会话。考虑使用MEDIUMBLOB
如果你需要更大的空间。
PostgreSQL
1 2 3 4 5 6
创建表格会话(sess_id .VARCHAR(128)不零主要的关键, sess_data BYTEA不零, sess_time整数不零, sess_lifetime整数不零);
Microsoft SQL Server
12 3 4 5 6 7 8 9 10 11 12 13 14 15
创建表格[dbo]。[session]([sess_id] [sess_id]]nvarchar](255)不零, [sess_data] [ntext]不零, [sess_time] [int]不零, [sess_lifetime] [int]不零、主关键集群([sess_id]ASC)与(pad_index =从, statistics_norecompute =从, ignore_dup_key =从, allow_row_locks =在, allow_page_locks =在)在[主要])在textimage_on [primary]
谨慎
如果会话数据不适合数据列,它可能会被数据库引擎截断。更糟糕的是,当会话数据损坏时,PHP忽略数据而不给出警告。
如果应用程序存储大量会话数据,则可以通过增加列大小(使用团
甚至MEDIUMBLOB
).当使用MySQL作为数据库引擎时,还可以启用严格SQL模式当这种错误发生时得到通知。