如何使用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”VARCHAR128主要的关键“sess_data”“sess_time”整数无符号“sess_lifetime”整数无符号核对utf8mb4_bin,引擎InnoDB

请注意

一个列类型最多只能存储64 kb。如果存储在用户会话中的数据超过了这个值,则可能引发异常或静默重置会话。考虑使用MEDIUMBLOB如果你需要更大的空间。

PostgreSQL

1 2 3 4 5 6
创建表格会话(sess_id .VARCHAR128主要的关键, 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模式当这种错误发生时得到通知。

此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。