将会话存储在数据库中
编辑本页将会话存储在数据库中
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”
- 第二个基于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_URL
Env 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 .VARCHAR(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_id .VARCHAR(128)不零主要的关键, 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},{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
): - 存储会话生存期的字段的名称。