> Symfony中文手册 > 限制Session元数据写入

限制Session元数据写入

PHP session的默认行为是不管session数据是否被改变都会持久化session。在Symfony中,每次session被访问,可以用来确定Session的时效和闲置时间的元数据(Metadata)都会被记录(session被创建/最后被使用)。

如果由于性能原因你想限制Session持久化的频率,此功能可以调整元数据(Metadata)的更新的间隔,并减少Session持久化的频率,同时仍然保持相对准确的元数据。如果其他Session数据发生了变化,这个session将始终持久化。

您可以用设置framework.session.metadata_update_threshold 的值大于 0 秒的方法,来告诉 Symfony 不去更新元数据“session Last used”的时间,直到隔了“你设置的这段时间后”才会再次更新(译注:也就是说你设置framework.session.metadata_update_threshold为120秒,你的session如何更新都会在每隔120秒后,元数据的“session Last used”才会更新一次)。

1
2
3
framework:
    session:
        metadata_update_threshold: 120
1
2
3
4
5
6
7
8
9
10
11
12
<?xml version="1.0" encoding="UTF-8" ?>
<container xmlns="Http://symfony.com/schema/dic/services"
    xmlns:framework="http://symfony.com/schema/dic/symfony"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd
                        http://symfony.com/schema/dic/symfony http://symfony.com/schema/dic/symfony/symfony-1.0.xsd">
 
    <framework:config>
        <framework:session metadata-update-threshold="120" />
    </framework:config>
 
</container>
1
2
3
4
5
$container->loadFromExtension('framework', array(
    'session' => array(
        'metadata_update_threshold' => 120,
    ),
));

PHP的默认行为是去保存session无论他是否改变。当使用framework.session.metadata_update_threshold时,Symfony会将session处理器(被配置的framework.session.handler_id)裹入(wrap)到WriteCheckSessionHandler中。这将防止任何没有被修改的Session写入。

请注意,如果session不是在每一个请求上都写,他可能比平时更早被垃圾回收。这意味着您的用户可能会比预期提前注销。