会话存储在一个数据库中
编辑该页面警告:你浏览的文档欧宝官网下载appob娱乐下载Symfony 4.4,不再维护。
读这个页面的更新版本Symfob娱乐下载ony 6.2(当前的稳定版本)。
会话存储在一个数据库中
ob娱乐下载Symfony将会话存储在默认的文件。如果您的应用程序是由多个服务器,您将需要使用一个数据库会话工作在不同的服务器上。
ob娱乐下载Symfony可以在各种各样的数据库存储会话(关系、NoSQL和键值),但建议键-值数据库喜欢复述,获得最佳的性能。
会话存储在一个键-值数据库(复述)
这部分假设您有一个有效的复述,服务器,也安装和配置phpredis扩展。
你有两个不同的选项来使用复述来存储会话:
(1)第一个基于php的选择是直接在服务器配置复述,会话处理程序php . ini
文件:
1 2 3
;php . inisession.save_handler=复述,session.save_path=“tcp: / / 192.168.0.178:6379 ? auth = REDIS_PASSWORD”
- 第二个Symfony-ob娱乐下载based选项配置复述,会议如下。
首先,定义一个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:我的密码}
接下来,使用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,它覆盖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_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
): - 字段的名称在哪里存储会话。