将会话存储在数据库中

编辑本页

将会话存储在数据库中

ob娱乐下载Symfony默认将会话存储在文件中。如果应用程序由多台服务器提供服务,则需要使用数据库来使会话跨不同的服务器工作。

ob娱乐下载Symfony可以在所有类型的数据库(关系型,NoSQL和键值数据库)中存储会话,但建议使用像Redis这样的键值数据库来获得最佳性能。

在键值数据库中存储会话(Redis)

本节假设您有一个正常工作的Redis服务器,并且已经安装和配置了phpredis扩展

你有两个不同的选项来使用Redis存储会话:

(1)基于php的第一个选项是直接在服务器上配置Redis会话处理程序php . ini文件:

1 2 3
;php . inisession.save_handler=复述,session.save_path“tcp: / / 192.168.0.178:6379 ?auth = REDIS_PASSWORD”
  1. 第二个基于symfonob娱乐下载e的选项是配置Redis会话,如下所示。

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

  • YAML
  • XML
  • PHP
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
#配置/ services.yaml服务:#……复述:#你也可以使用\RedisArray, \RedisCluster或\Predis\Client类类:复述,电话:-连接:-' % env (REDIS_HOST) %-' % env (int: REDIS_PORT) %如果你的Redis服务器需要密码,#取消注释# - auth:# - '%env(REDIS_PASSWORD)%'如果你的Redis服务器需要用户和密码(当user不是默认值时),#取消下面的注释# - auth:# - ['%env(REDIS_USER)%','%env(REDIS_PASSWORD)%']

现在把这个传过去\复述,类关联的服务的参数RedisSessionHandler.这个参数也可以是a\ RedisArray\ RedisCluster\ Predis \客户,RedisProxy

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8 9 10
#配置/ services.yaml服务:#……ob娱乐下载Symfony \ HttpFoundation \会议\ \组件存储\处理器\ RedisSessionHandler:参数:-“@Redis”#你可以选择传递一个选项数组。唯一的选项是'prefix'和'ttl',#定义前缀用于避免在Redis服务器上发生冲突的键#和任何给定条目的过期时间(以秒为单位),默认为'sf_s'和null:# - {'prefix': '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现在将使用Redis服务器读取和写入会话数据。这个解决方案的主要缺点是Redis不执行会话锁定,所以你可以面对竞态条件访问会话时。例如,你可能会看到一个“无效CSRF令牌”错误,因为两个请求是并行发出的,并且只有第一个请求在会话中存储了CSRF令牌。

另请参阅

如果你使用Memcached而不是Redis,遵循类似的方法,但替换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: mypassword}

提示

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

5.3

支持字符集而且unix_socket在Symfony 5.3中引入了options。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_URL它会覆盖在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_id .VARCHAR128主要的关键, sess_data BYTEA, sess_lifetime整数, sess_time整数);创建指数sessions_sess_lifetime_idx会话(sess_lifetime);

Microsoft SQL Server

1 2 3 4 5 6 7
创建表格会话(sess_id .VARCHAR128主要的关键, sess_dataNVARCHAR马克斯, sess_lifetime整数, sess_time整数指数sessions_sess_lifetime (sess_lifetime));

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

ob娱乐下载Symfony包含一个MongoDbSessionHandler在MongoDB NoSQL数据库中存储会话。首先,确保您的Symfony应用程序中有一个正常工作的MongoDB连接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 ODMx只适用于遗留驱动程序,Symfony会话类不再支持它。ob娱乐下载安装阿尔凯奥斯/ mongo-php-adapter包来检索底层\ MongoDB \客户对象或升级到MongoDB ODM 2.0。

这是所有!ob娱乐下载Symfony现在将使用MongoDB服务器读取和写入会话数据。初始化会话集合不需要做任何事情。但是,您可能希望添加索引来提高垃圾收集性能。从MongoDB shell

1 2
使用session_db数据库。方法createIndex ({“expires_at”1},{expireAfterSeconds0})

配置会话字段名

用于存储会话的集合定义了某些字段名。属性的第二个参数可以配置这些值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):
存储会话生存期的字段的名称。
此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。
ob娱乐下载Symfony 5.4支持通过私人Packagist