如何使用PdoSessionHandler在数据库中存储会话吗

编辑该页面

警告:你浏览的文档欧宝官网下载appob娱乐下载Symfony 3.3,不再维护。

这个页面的更新版本Symfob娱乐下载ony 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 '- - - - - -{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 '- - - - - -{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):
时间列在您的会话表的名称(整数);
db_lifetime_col(默认sess_lifetime):
一生的名字列在您的会话表(整数)。

分享您的数据库连接信息

用给定的配置、数据库连接设置仅为会话存储连接定义。这是好的当你使用一个单独的数据库会话数据。

但是如果你想将会话数据存储在同一个数据库作为你其他的项目的数据,您可以使用的连接设置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美元e){/ /创建的表不能因为某些原因}

如果你喜欢自己设置表,这是一些SQL语句的例子你可以使用根据你具体的数据库引擎。

MySQL

1 2 3 4 5 6
创建“会话”(“sess_id”VARCHAR(128年)关键,“sess_data”,“sess_time”整数无符号,“sess_lifetime”MEDIUMINT)核对utf8_bin,引擎=InnoDB;

请注意

一个列类型只能存储64 kb。如果数据存储在用户的会话超过这个,可能会抛出一个异常或他们的会话会默默地重置。考虑使用MEDIUMBLOB如果你需要更多的空间。

PostgreSQL

1 2 3 4 5 6
创建会话(sess_idVARCHAR(128年)关键,sess_data BYTEA,sess_time整数,sess_lifetime整数);

Microsoft SQL Server

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
创建[dbo]。[活动]([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(初级)

谨慎

如果会话数据不适合的数据列,它可能会被截断的数据库引擎。更糟的是,PHP会话数据被损坏时,忽略了数据没有给出一个警告。

如果应用程序商店大量的会话数据,这个问题可以解决通过增加列大小(使用甚至MEDIUMBLOB)。当使用MySQL作为数据库引擎的时候,你也可以启用严格的SQL模式这种错误发生时得到通知。

这项工作,包括代码示例,许可下Creative Commons冲锋队3.0许可证。