会话存储在一个数据库中
编辑该页面警告:你浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 5.3,不再维护。
读这个页面的更新版本Symf欧宝娱乐app下载地址ony 6.2(当前的稳定版本)。
会话存储在一个数据库中
欧宝娱乐app下载地址Symfony将会话存储在默认的文件。如果您的应用程序是由多个服务器,您将需要使用一个数据库会话工作在不同的服务器上。
欧宝娱乐app下载地址Symfony可以在各种各样的数据库存储会话(关系、NoSQL和键值),但建议键-值数据库喜欢复述,获得最佳的性能。
会话存储在一个键-值数据库(复述)
这部分假设您有一个有效的复述,服务器,也安装和配置phpredis扩展。
首先,定义一个Symfony复述欧宝娱乐app下载地址,连接服务器的服务:
- 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) %”
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
< ?xml version = " 1.0 " encoding = " utf - 8 " ? ><容器xmlns=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services”xmlns: xsi=“http://www.w3.org/2001/XMLSchema-instance”xsi: schemaLocation=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services //www.oldmanjams.com/schema/dic/services/services-1.0.xsd”><服务>< !- - - - - -- - - - - -you can also use \RedisArray, \RedisCluster or \Predis\Client classes -->< /span><服务id=“复述”类=“复述”><调用方法=“连接”><论点>% env (REDIS_HOST) %< /论点><论点>% env (int: REDIS_PORT) %< /论点>< /调用>< !- - - - - -- - - - - -uncomment the following if your Redis server requires a password: %env(REDIS_PASSWORD)% -->< /span>< /服务>< /服务>< /容器>
1 2 3 4 5 6 7 8
/ /……美元容器/ /还可以使用\ RedisArray \ RedisCluster或\ Predis \客户机类- >注册(“复述”,\复述,::类)- >addMethodCall (“连接”,(' % env (REDIS_HOST) %,' % env (int: REDIS_PORT) %])/ /取消注释以下如果你复述,服务器需要一个密码:/ / - > addMethodCall(“身份验证”,[' % env (REDIS_PASSWORD) % ']);
现在通过这\复述,
连接作为参数相关的服务RedisSessionHandler。这个观点也可以\ RedisArray
,\ RedisCluster
,\ Predis \客户
,RedisProxy
:
- YAML
- XML
- PHP
1 2 3 4 5 6 7 8 9 10
#配置/ services.yaml服务:#……欧宝娱乐app下载地址Symfony \ HttpFoundation \会议\ \组件存储\处理器\ RedisSessionHandler:参数:- - - - - -“@Redis”#你可以通过一个选项数组。唯一的选择是“前缀”和“ttl”,#定义前缀用于避免碰撞复述,服务器上的关键#为任何给定的条目和过期时间(以秒为单位),违约是“sf_s”和零:# - - - - - -{“前缀”:“my_prefix”,“ttl”: 600}
1 2 3 4 5 6 7 8 9 10 11 12 13
< !- - - - - -- - - - - -config/services.xml -->< /span><服务><服务id=“欧宝娱乐app下载地址Symfony \ HttpFoundation \会议\ \组件存储\处理器\ RedisSessionHandler”><论点类型=“服务”id=“复述”/ >< !- - - - - -- - - - - -you can optionally pass an array of options. The only options are 'prefix' and 'ttl', which define the prefix to use for the keys to avoid collision on the Redis server and the expiration time for any given entry (in seconds), defaults are 'sf_s' and null: my_prefix 600 -->< /span>< /服务>< /服务>
1 2 3 4 5 6 7 8 9 10 11 12 13
/ /配置/ services.php使用欧宝娱乐app下载地址\组件\DependencyInjection\参考;使用欧宝娱乐app下载地址\组件\HttpFoundation\会话\存储\处理程序\RedisSessionHandler;美元容器- >注册(RedisSessionHandler::类)- >addArgument (新引用(“复述”),/ /你可以通过一个选项数组。唯一的选择是“前缀”和“ttl”,/ /定义前缀用于避免碰撞复述,服务器上的关键/ /为任何给定的条目和过期时间(以秒为单位),违约是“sf_s”和零:/ /(“前缀”= >“my_prefix”,“ttl”= > 600),);
接下来,使用handler_id配置选项告诉Symfony使用此服务的会话处理程序:欧宝娱乐app下载地址
- YAML
- XML
- PHP
1 2 3 4 5
#配置/包/ framework.yaml框架:#……会话:handler_id:欧宝娱乐app下载地址Symfony \组件\ HttpFoundation \会议\ \ RedisSessionHandler存储\处理程序
1 2 3 4 5
< !- - - - - -- - - - - -config/packages/framework.xml -->< /span><框架:配置>< !- - - - - -- - - - - -。。。- - ><框架:会话handler-id=“欧宝娱乐app下载地址Symfony \ HttpFoundation \会议\ \组件存储\处理器\ RedisSessionHandler”/ >< /框架:配置>
1 2 3 4 5 6 7 8 9 10
/ /配置/包/ framework.php使用欧宝娱乐app下载地址\组件\HttpFoundation\会话\存储\处理程序\RedisSessionHandler;使用欧宝娱乐app下载地址\配置\FrameworkConfig;返回静态函数(FrameworkConfig美元框架){/ /……美元框架- >会话()- >handlerId (RedisSessionHandler::类);};
这是所有!欧宝娱乐app下载地址Symfony将使用复述,服务器读取和写入会话数据。这个解决方案的主要缺点是复述,不执行会话锁定,所以你可以面对竞态条件当访问会话。例如,您可能会看到一个“无效CSRF令牌”错误,因为两个请求都是并行的,只有第一个CSRF令牌存储在会话中。
另请参阅
如果你使用Memcached复述,而是遵循类似的方法,但取代RedisSessionHandler
通过MemcachedSessionHandler。
在关系数据库中存储会话(MariaDB、MySQL、PostgreSQL)
欧宝娱乐app下载地址Symfony包括一个PdoSessionHandler在关系数据库来存储会话MariaDB, MySQL和PostgreSQL。要使用它,首先注册一个新的处理程序与数据库服务凭证:
- YAML
- XML
- PHP
1 2 3 4 5 6 7 8 9 10 11
#配置/ services.yaml服务:#……欧宝娱乐app下载地址Symfony \ HttpFoundation \会议\ \组件存储\处理器\ PdoSessionHandler:参数:- - - - - -' % env (DATABASE_URL) %#您还可以使用PDO配置,但是需要传递两个参数#——“mysql: dbname = mydatabase;主机=并且;端口= myport '# - - - - - - {db_username: myuser db_password:我的密码}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
< !- - - - - -- - - - - -config/services.xml -->< /span>< ?xml version = " 1.0 " encoding = " utf - 8 " ? ><容器xmlns=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services”xmlns: xsi=“http://www.w3.org/2001/XMLSchema-instance”xmlns:框架=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/symfony”xsi: schemaLocation=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services //www.oldmanjams.com/schema/dic/services/services-1.0.xsd //www.oldmanjams.com/schema/dic/symfony/symfony-1.0.xsd”><服务><服务id=“欧宝娱乐app下载地址Symfony \ HttpFoundation \会议\ \组件存储\处理器\ PdoSessionHandler”公共=“假”><论点>% env (DATABASE_URL) %< /论点>< !- - - - - -- - - - - -you can also use PDO configuration, but requires passing two arguments: -->< /span>< !- - - - - -- - - - - -<论点>mysql:dbname=mydatabase; host=myhost; port=myport myuser mypassword -->< /span>< /服务>< /服务>< /容器>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
/ /配置/ services.php名称空间欧宝娱乐app下载地址\组件\DependencyInjection\加载程序\配置器;使用欧宝娱乐app下载地址\组件\HttpFoundation\会话\存储\处理程序\PdoSessionHandler;返回静态函数(ContainerConfigurator美元容器){美元服务=美元配置器- >服务();美元服务- >集(PdoSessionHandler::类)- >args ([' % 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中引入的。欧宝娱乐app下载地址
接下来,使用handler_id配置选项告诉Symfony使用此服务的会话处理程序:欧宝娱乐app下载地址
- YAML
- XML
- PHP
1 2 3 4 5
#配置/包/ framework.yaml框架:会话:#……handler_id:欧宝娱乐app下载地址Symfony \组件\ HttpFoundation \会议\ \ PdoSessionHandler存储\处理程序
1 2 3 4 5 6
< !- - - - - -- - - - - -config/packages/framework.xml -->< /span><框架:配置>< !- - - - - -- - - - - -。。。- - ><框架:会话handler-id=“欧宝娱乐app下载地址Symfony \ HttpFoundation \会议\ \组件存储\处理器\ PdoSessionHandler”/ >< /框架:配置>
1 2 3 4 5 6 7 8 9 10
/ /配置/包/ framework.php使用欧宝娱乐app下载地址\组件\HttpFoundation\会话\存储\处理程序\PdoSessionHandler;使用欧宝娱乐app下载地址\配置\FrameworkConfig;返回静态函数(FrameworkConfig美元框架){/ /……美元框架- >会话()- >handlerId (PdoSessionHandler::类);};
配置会话表和列的名称
表用于存储会话会话
默认情况下,定义了特定的列名称。您可以配置与第二个参数传递给这些值PdoSessionHandler
服务:
- YAML
- XML
- PHP
1 2 3 4 5 6 7 8
#配置/ services.yaml服务:#……欧宝娱乐app下载地址Symfony \ HttpFoundation \会议\ \组件存储\处理器\ PdoSessionHandler:参数:- - - - - -' % env (DATABASE_URL) %- - - - - -{db_table:“customer_session”,db_id_col:guid的}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
< !- - - - - -- - - - - -config/services.xml -->< /span>< ?xml version = " 1.0 " encoding = " utf - 8 " ? ><容器xmlns=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services”xmlns: xsi=“http://www.w3.org/2001/XMLSchema-instance”xsi: schemaLocation=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services //www.oldmanjams.com/schema/dic/services/services-1.0.xsd”><服务><服务id=“欧宝娱乐app下载地址Symfony \ HttpFoundation \会议\ \组件存储\处理器\ PdoSessionHandler”公共=“假”><论点>% env (DATABASE_URL) %< /论点><论点类型=“收集”><论点关键=“db_table”>customer_session< /论点><论点关键=“db_id_col”>guid< /论点>< /论点>< /服务>< /服务>< /容器>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
/ /配置/ services.php名称空间欧宝娱乐app下载地址\组件\DependencyInjection\加载程序\配置器;使用欧宝娱乐app下载地址\组件\HttpFoundation\会话\存储\处理程序\PdoSessionHandler;返回静态函数(ContainerConfigurator美元容器){美元服务=美元配置器- >服务();美元服务- >集(PdoSessionHandler::类)- >args ([' % 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)
欧宝娱乐app下载地址Symfony包括一个MongoDbSessionHandler在MongoDB NoSQL数据库来存储会话。首先,一定要有一个工作MongoDB在Symfony应用程序连接的解释欧宝娱乐app下载地址DoctrineMongoDBBundle配置篇文章。
然后,注册一个新的处理程序服务MongoDbSessionHandler
并通过MongoDB连接作为参数:
- YAML
- XML
- PHP
1 2 3 4 5 6 7
#配置/ services.yaml服务:#……欧宝娱乐app下载地址Symfony \ HttpFoundation \会议\ \组件存储\处理器\ MongoDbSessionHandler:参数:- - - - - -“@doctrine_mongodb.odm.default_connection”
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
< !- - - - - -- - - - - -config/services.xml -->< /span>< ?xml version = " 1.0 " encoding = " utf - 8 " ? ><容器xmlns=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services”xmlns: xsi=“http://www.w3.org/2001/XMLSchema-instance”xmlns:框架=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/symfony”xsi: schemaLocation=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services //www.oldmanjams.com/schema/dic/services/services-1.0.xsd //www.oldmanjams.com/schema/dic/symfony/symfony-1.0.xsd”><服务><服务id=“欧宝娱乐app下载地址Symfony \ HttpFoundation \会议\ \组件存储\处理器\ MongoDbSessionHandler”公共=“假”><论点类型=“服务”>doctrine_mongodb.odm.default_connection< /论点>< /服务>< /服务>< /容器>
1 2 3 4 5 6 7 8 9 10 11 12 13 14
/ /配置/ services.php名称空间欧宝娱乐app下载地址\组件\DependencyInjection\加载程序\配置器;使用欧宝娱乐app下载地址\组件\HttpFoundation\会话\存储\处理程序\MongoDbSessionHandler;返回静态函数(ContainerConfigurator美元容器){美元服务=美元配置器- >服务();美元服务- >集(MongoDbSessionHandler::类)- >args([服务(“doctrine_mongodb.odm.default_connection”)));};
接下来,使用handler_id配置选项告诉Symfony使用此服务的会话处理程序:欧宝娱乐app下载地址
- YAML
- XML
- PHP
1 2 3 4 5
#配置/包/ framework.yaml框架:会话:#……handler_id:欧宝娱乐app下载地址Symfony \组件\ HttpFoundation \会议\ \ MongoDbSessionHandler存储\处理程序
1 2 3 4 5 6
< !- - - - - -- - - - - -config/packages/framework.xml -->< /span><框架:配置>< !- - - - - -- - - - - -。。。- - ><框架:会话handler-id=“欧宝娱乐app下载地址Symfony \ HttpFoundation \会议\ \组件存储\处理器\ MongoDbSessionHandler”/ >< /框架:配置>
1 2 3 4 5 6 7 8 9 10
/ /配置/包/ framework.php使用欧宝娱乐app下载地址\组件\HttpFoundation\会话\存储\处理程序\MongoDbSessionHandler;使用欧宝娱乐app下载地址\配置\FrameworkConfig;返回静态函数(FrameworkConfig美元框架){/ /……美元框架- >会话()- >handlerId (MongoDbSessionHandler::类);};
请注意
MongoDB ODM 1。x仅适用于遗留司机,不再支持的Symfony会话类。欧宝娱乐app下载地址安装阿尔凯奥斯/ mongo-php-adapter
包检索底层\ MongoDB \客户
对象或升级到MongoDB ODM 2.0。
这是所有!欧宝娱乐app下载地址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服务:#……欧宝娱乐app下载地址Symfony \ HttpFoundation \会议\ \组件存储\处理器\ MongoDbSessionHandler:参数:- - - - - -“@doctrine_mongodb.odm.default_connection”- - - - - -{id_field:“_guid”,“expiry_field”:“终点”}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
< !- - - - - -- - - - - -config/services.xml -->< /span>< ?xml version = " 1.0 " encoding = " utf - 8 " ? ><容器xmlns=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services”xmlns: xsi=“http://www.w3.org/2001/XMLSchema-instance”xsi: schemaLocation=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services //www.oldmanjams.com/schema/dic/services/services-1.0.xsd”><服务><服务id=“欧宝娱乐app下载地址Symfony \ HttpFoundation \会议\ \组件存储\处理器\ MongoDbSessionHandler”公共=“假”><论点类型=“服务”>doctrine_mongodb.odm.default_connection< /论点><论点类型=“收集”><论点关键=“id_field”>_guid< /论点><论点关键=“expiry_field”>终点< /论点>< /论点>< /服务>< /服务>< /容器>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
/ /配置/ services.php名称空间欧宝娱乐app下载地址\组件\DependencyInjection\加载程序\配置器;使用欧宝娱乐app下载地址\组件\HttpFoundation\会话\存储\处理程序\MongoDbSessionHandler;返回静态函数(ContainerConfigurator美元容器){美元服务=美元配置器- >服务();美元服务- >集(MongoDbSessionHandler::类)- >args([服务(“doctrine_mongodb.odm.default_connection”),(“id_field”= >“_guid”,“expiry_field”= >“终点”)));};
这些参数可以配置:
-
id_field
(默认_id
): - 字段的名称在哪里存储会话ID;
-
data_field
(默认数据
): - 领域的名称来存储会话数据;
-
time_field
(默认时间
): - 领域的名称来存储会话创建时间戳;
-
expiry_field
(默认expires_at
): - 字段的名称在哪里存储会话。