Odoo(OpenERP) Session有效期

在openerp目录下的http.py文件中,有个session_gc()方法,此方法定义了session清理的逻辑。方法如下:
def session_gc(session_store):
    if random.random() < 0.001:
        # we keep session one week
        last_week = time.time() - 60*60*24*7
        for fname in os.listdir(session_store.path):
            path = os.path.join(session_store.path, fname)
            try:
                if os.path.getmtime(path) < last_week:
                    os.unlink(path)
            except OSError:
                pass

重点在这两行:
(1)if random.random() < 0.001:
random.random()用于生成一个0到1的随机符点数,这个随机数小于0.001的概率为千分之一,此if条件表示平均每1000次请求执行一次session回收。使用这个条件主要是为了避免每次操作都执行session检查,以节约有限的服务器资源。
(2)last_week = time.time() - 60*60*24*7
服务器上的session会保存一周,一周前的session文件会被删除。某个客户端对应在服务器上的session被删除后,如果还有来自这个客户端的操作,会得到404错误(更人性化的处理方式应该是直接重定向到登录界面),这时需要注销并重新登录才能继续操作。

小问题:
所有session都失效后,session文件夹下仍有一个.sess文件,且该文件内容是无效的,不知何故?
### 如何设置和管理Session有效期 #### Session有效期的概念 Session有效期是指服务器端保存会话数据的时间长度。一旦超过了设定的时间,该会话就会被标记为可回收状态并最终清除。这有助于提高系统的安全性以及减少不必要的资源占用。 #### PHP中的`session.gc_maxlifetime` 在PHP环境中,通过配置项`session.gc_maxlifetime`可以定义Session的最大存活时间(单位秒)。当超过此时间段后,对应的Session将会被认为过期,并加入到垃圾收集列表等待清理[^1]。 #### 配置文件修改法 对于大多数Web应用而言,在项目的根目录下找到`.htaccess`或者相应的环境变量配置处添加或调整如下参数即可改变默认行为: ```apacheconf php_value session.gc_maxlifetime 3600 ; 即一小时 ``` 另外还可以同步更改Cookie的生命周期以保持一致性: ```apacheconf php_value session.cookie_lifetime 3600 ``` 这种方法适用于希望全局生效的情况[^3]。 #### 动态编程接口调用 除了静态地编辑配置外,也可以利用PHP内置函数动态地影响当前请求所使用的Session选项。例如可以在脚本开头部分执行下面这段代码来临时延长某个用户的在线时长而不必重启整个服务进程: ```php <?php // 将gc_maxlifetime设为一天86400秒 ini_set('session.gc_maxlifetime', '86400'); ?> ``` #### 自定义存储机制 针对更复杂的需求场景比如分布式部署下的高并发访问压力测试,则推荐采用自定义的方式处理Session持久化逻辑——即重写标准API实现类完成对读取/写入操作的支持。具体做法是在应用程序启动之前注册新的处理器实例对象给系统知道应该去哪里查找特定ID关联的数据记录而不是依赖于传统的文件形式缓存方案。这种方式允许开发者更加灵活精准地掌控每一个环节从而达到最优性能表现的同时也便于后期维护升级工作开展[^4]。 #### Odoo框架内的特殊处理 Odoo作为一个开源的企业级ERP平台在其源码中有专门负责管理和监控活跃连接数目的模块存在。位于`odoo/http.py`里的`session_gc()`函数每隔一段时间随机抽取一定比例样本进行检查进而决定哪些条目应当被淘汰掉以便腾出更多空间供新创建者使用[^5]。 ```python def session_gc(session_store): if random.random() < 0.001: # Keep sessions for at least a week. last_week = time.time() - (60 * 60 * 24 * 7) for fname in os.listdir(session_store.path): path = os.path.join(session_store.path, fname) try: if os.path.getmtime(path) < last_week: os.unlink(path) except OSError: pass ``` 上述代码片段展示了如何定期扫描指定位置并将那些长时间未更新过的项目移除出去的过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值