会话存储在一个数据库中

编辑该页面

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

这个页面的更新版本Symfob娱乐下载ony 6.2(当前的稳定版本)。

会话存储在一个数据库中

ob娱乐下载Symfony将会话存储在默认的文件。如果您的应用程序是由多个服务器,您将需要使用一个数据库会话工作在不同的服务器上。

ob娱乐下载Symfony可以在各种各样的数据库存储会话(关系、NoSQL和键值),但建议键-值数据库喜欢复述,获得最佳的性能。

会话存储在一个键-值数据库(复述)

这部分假设您有一个有效的复述,服务器,也安装和配置phpredis扩展

首先,定义一个Symfony复述ob娱乐下载,连接服务器的服务:

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8 9 10 11 12 13 14
#配置/ services.yaml服务:#……复述:#您还可以使用\ RedisArray \ RedisCluster或\ Predis \客户机类类:复述,电话:- - - - - -连接:- - - - - -' % env (REDIS_HOST) %- - - - - -' % env (int: REDIS_PORT) %#取消注释以下如果你复述,服务器需要一个密码#——身份验证:# % env (REDIS_PASSWORD) %”

现在通过这\复述,连接作为参数相关的服务RedisSessionHandler。这个观点也可以\ RedisArray,\ RedisCluster,\ Predis \客户,RedisProxy:

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8 9 10
#配置/ services.yaml服务:#……ob娱乐下载Symfony \ HttpFoundation \会议\ \组件存储\处理器\ RedisSessionHandler:参数:- - - - - -“@Redis”#你可以通过一个选项数组。唯一的选择是“前缀”和“ttl”,#定义前缀用于避免碰撞复述,服务器上的关键#为任何给定的条目和过期时间(以秒为单位),违约是“sf_s”和零:# - - - - - -{“前缀”:“my_prefix”,“ttl”: 600}

接下来,使用handler_id配置选项告诉Symfony使用此服务的会话处理程序:ob娱乐下载

  • YAML
  • XML
  • PHP
1 2 3 4 5
#配置/包/ framework.yaml框架:#……会话:handler_id:ob娱乐下载Symfony \组件\ HttpFoundation \会议\ \ RedisSessionHandler存储\处理程序

这是所有!ob娱乐下载Symfony将使用复述,服务器读取和写入会话数据。这个解决方案的主要缺点是复述,不执行会话锁定,所以你可以面对竞态条件当访问会话。例如,您可能会看到一个“无效CSRF令牌”错误,因为两个请求都是并行的,只有第一个CSRF令牌存储在会话中。

另请参阅

如果你使用Memcached复述,而是遵循类似的方法,但取代RedisSessionHandler通过MemcachedSessionHandler

在关系数据库中存储会话(MariaDB、MySQL、PostgreSQL)

ob娱乐下载Symfony包括一个PdoSessionHandler在关系数据库来存储会话MariaDB, MySQL和PostgreSQL。要使用它,首先注册一个新的处理程序与数据库服务凭证:

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8 9 10 11
#配置/ services.yaml服务:#……ob娱乐下载Symfony \ HttpFoundation \会议\ \组件存储\处理器\ PdoSessionHandler:参数:- - - - - -' % env (DATABASE_URL) %#您还可以使用PDO配置,但是需要传递两个参数#——“mysql: dbname = mydatabase;主机=并且;端口= myport '# - - - - - - {db_username: myuser db_password:我的密码}

提示

当使用MySQL作为数据库,在定义的DSNDATABASE_URL可以包含字符集unix_socket选择作为查询字符串参数。

5.3

支持字符集unix_socket选项是在Symfony 5.3中引入的。ob娱乐下载

接下来,使用handler_id配置选项告诉Symfony使用此服务的会话处理程序:ob娱乐下载

  • YAML
  • XML
  • PHP
1 2 3 4 5
#配置/包/ framework.yaml框架:会话:#……handler_id:ob娱乐下载Symfony \组件\ HttpFoundation \会议\ \ PdoSessionHandler存储\处理程序

配置会话表和列的名称

表用于存储会话会话默认情况下,定义了特定的列名称。您可以配置与第二个参数传递给这些值PdoSessionHandler服务:

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8
#配置/ services.yaml服务:#……ob娱乐下载Symfony \ HttpFoundation \会议\ \组件存储\处理器\ PdoSessionHandler:参数:- - - - - -' % env (DATABASE_URL) %- - - - - -{db_table:“customer_session”,db_id_col:guid的}

这些参数可以配置:

db_table(默认会话):
会话表的名称在数据库中;
db_username(默认值:)
用户名用于连接在使用PDO配置(当使用连接的基础上DATABASE_URLenv var,它覆盖env var)中定义的用户名。
db_password(默认值:)
密码用于连接在使用PDO配置(当使用连接的基础上DATABASE_URLenv var,它覆盖env var)中定义的密码。
db_id_col(默认sess_id):
的名字列在哪里存储会话ID(列类型:VARCHAR (128));
db_data_col(默认sess_data):
的名字列在哪里存储会话数据(列类型:);
db_time_col(默认sess_time):
的名字列在哪里存储会话创建时间戳(列类型:整数);
db_lifetime_col(默认sess_lifetime):
的名字列在哪里存储会话中(列类型:整数);
db_connection_options(默认值:[])
数组的连接选项;
lock_mode(默认值:LOCK_TRANSACTIONAL)
战略锁定数据库,以避免竞态条件。可能的值是LOCK_NONE(没有锁定),LOCK_ADVISORY(应用程序级锁定)LOCK_TRANSACTIONAL(行级别锁定)。

准备数据库来存储会话

在数据库中存储会话之前,您必须创建表,存储信息。会话处理程序提供了一个方法调用不知道()为你设置此表根据所使用的数据库引擎:

1 2 3 4 5
试一试{美元sessionHandlerService- >不知道();}(\ PDOException美元异常){/ /创建的表不能因为某些原因}

如果你喜欢自己设置表,它是建议用以下命令生成一个空的数据库迁移:

1
美元php bin /控制台学说:迁移:生成

然后,找到适当的SQL数据库,将其添加到迁移文件并运行迁移使用下面的命令:

1
美元php bin /控制台学说:迁移:迁移

MariaDB / MySQL

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

请注意

一个列类型(这是默认情况下使用不知道()64 kb)。如果用户会话数据超过了这个,可能会抛出一个异常或他们的会话会默默地重置。考虑使用MEDIUMBLOB如果你需要更多的空间。

PostgreSQL

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

Microsoft SQL Server

1 2 3 4 5 6 7
创建会话(sess_idVARCHAR(128年)关键,sess_dataNVARCHAR(马克斯),sess_lifetime整数,sess_time整数,指数sessions_sess_lifetime_idx (sess_lifetime));

会话存储在NoSQL数据库(MongoDB)

ob娱乐下载Symfony包括一个MongoDbSessionHandler在MongoDB NoSQL数据库来存储会话。首先,一定要有一个工作MongoDB在Symfony应用程序连接的解释ob娱乐下载DoctrineMongoDBBundle配置篇文章。

然后,注册一个新的处理程序服务MongoDbSessionHandler并通过MongoDB连接作为参数:

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7
#配置/ services.yaml服务:#……ob娱乐下载Symfony \ HttpFoundation \会议\ \组件存储\处理器\ MongoDbSessionHandler:参数:- - - - - -“@doctrine_mongodb.odm.default_connection”

接下来,使用handler_id配置选项告诉Symfony使用此服务的会话处理程序:ob娱乐下载

  • YAML
  • XML
  • PHP
1 2 3 4 5
#配置/包/ framework.yaml框架:会话:#……handler_id:ob娱乐下载Symfony \组件\ HttpFoundation \会议\ \ MongoDbSessionHandler存储\处理程序

请注意

MongoDB ODM 1。x仅适用于遗留司机,不再支持的Symfony会话类。ob娱乐下载安装阿尔凯奥斯/ mongo-php-adapter包检索底层\ MongoDB \客户对象或升级到MongoDB ODM 2.0。

这是所有!ob娱乐下载Symfony将现在使用MongoDB服务器读写会话数据。你不需要做任何事情来初始化您的会话集合。然而,您可能想添加一个索引来提高垃圾收集的性能。运行这个的MongoDB shell:

1 2
使用session_db db.session。方法createIndex ({“expires_at”:1},{expireAfterSeconds:0})

配置会话字段名称

用于存储会话集合定义了特定的字段名称。您可以配置与第二个参数传递给这些值MongoDbSessionHandler服务:

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8
#配置/ services.yaml服务:#……ob娱乐下载Symfony \ HttpFoundation \会议\ \组件存储\处理器\ MongoDbSessionHandler:参数:- - - - - -“@doctrine_mongodb.odm.default_connection”- - - - - -{id_field:“_guid”,“expiry_field”:“终点”}

这些参数可以配置:

id_field(默认_id):
字段的名称在哪里存储会话ID;
data_field(默认数据):
领域的名称来存储会话数据;
time_field(默认时间):
领域的名称来存储会话创建时间戳;
expiry_field(默认expires_at):
字段的名称在哪里存储会话。
这项工作,包括代码示例,许可下Creative Commons冲锋队3.0许可证。
ob娱乐下载Symfony 5.3支持通过JoliCode