php中session超时严格控制的解决方案

2023-11-01

php中session默认是30分钟超时,但是有的时间压根就没到30分钟就自动超时了,这对很多操作带来不便,下面我们来看看解决30分钟超时的办法。

第一种回答

最常见的一种回答是: 设置Session的过期时间, 也就是session.gc_maxlifetime, 这种回答是不正确的, 原因如下:

1. 首先, 这个PHP是用一定的概率来运行session的gc的, 也就是session.gc_probability和session.gc_pisor(介绍参看 深入理解PHP原理之Session Gc的一个小概率Notice), 这个默认的值分别是1和100, 也就是有1%的机会, PHP会在一个Session启动时, 运行Session gc. 不能保证到30分钟的时候一定会过期.

2. 那设置一个大概率的清理机会呢? 还是不妥, 为什么? 因为PHP使用stat Session文件的修改时间来判断是否过期, 如果增大这个概率一来会降低性能, 二来, PHP使用”一个”文件来保存和一个会话相关的Session变量, 假设我5分钟前设置了一个a=1的Session变量, 5分钟后又设置了一个b=2的Seesion变量, 那么这个Session文件的修改时间为添加b时刻的时间, 那么a就不能在30分钟的时候, 被清理了. 另外还有下面第三个原因.

3. PHP默认的(Linux为例), 是使用/tmp 作为Session的默认存储目录, 并且手册中也有如下的描述:

Note: 如果不同的脚本具有不同的 session.gc_maxlifetime 数值但是共享了同一个地方存储会话数据,则具有最小数值的脚本会清理数据。此情况下,与 session.save_path 一起使用本指令。

也就是说, 如果有俩个应用都没有指定自己独立的save_path, 一个设置了过期时间为2分钟(假设为A), 一个设置为30分钟(假设为B), 那么每次当A的Session gc运行的时候, 就会同时删除属于应用B的Session files.

所以, 第一种答案是不”完全严格”正确的.

第二种答案

还有一种常见的答案是: 设置Session ID的载体, Cookie的过期时间, 也就是session.cookie_lifetime. 这种回答也是不正确的, 原因如下:这个过期只是Cookie过期, 换个说法这点就考察Cookie和Session的区别, Session过期是服务器过期, 而Cookie过期是客户端(浏览器)来保证的, 即使你设置了Cookie过期, 这个只能保证标准浏览器到期的时候, 不会发送这个Cookie(包含着Session ID), 而如果通过构造请求, 还是可以使用这个Session ID的值.

第三种答案

使用memcache, redis等, okey, 这种答案是一种正确答案. 不过, 很显然出题者肯定还会接着问你, 如果只是使用PHP呢?

第四种答案

当然, 面试不是为了难道你, 而是为了考察思考的周密性. 在这个过程中我会提示出这些陷阱, 所以一般来说, 符合题意的做法是:

1. 设置Cookie过期时间30分钟, 并设置Session的lifetime也为30分钟.

2. 自己为每一个Session值增加Time stamp.

3. 每次访问之前, 判断时间戳.

PHP原理之Session Gc的一个小概率Notice,如果在ubuntu/Debian下, 采用apt安装的PHP, 那么在使用Session的时候, 就可能会有小概率遇到这个提示.

  1. PHP Notice: session_start(): ps_files_cleanup_dir: 
  2.  opendir(/var/lib/php5) failed: Permission denied (13) 
  3.  in /home/laruence/www/htdocs/index.php on line 22< li> 

这是因为, 在PHP中, 如果使用file_handler作为Session的save handler, 那么就有概率在每次session_start的时候运行Session的Gc过程.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

php中session超时严格控制的解决方案 的相关文章

  • php 打印 aa aaa ab aab 直到 zzz 的算法

    你好 我需要打印从 a 到 zzz 最多 3 个字母 例如我的输出应该是 A B Z AA AB AZ BA BB ZZ AAA AAB ZZZ 我在过去的 5 个小时里努力尝试 我找不到任何逻辑 我尝试了下面的代码 PHP 有一个方便的功
  • 如何以 Magento 方式实现库存过滤器?

    在我的 magento 网站上可以看到缺货的产品 我想要在分层导航中添加一个自定义过滤器 其中显示 排除缺货 当客户单击它时 应该隐藏缺货产品 默认情况下 我在 系统 gt 配置 gt 目录 gt 库存 下启用显示 显示缺货产品 即我希望客
  • Smarty 3 或更早版本中有类似 Dwoo-s {with} 或 {loop} 的东西吗?

    Dwoo 模板引擎中的 with 和 loop 插件更改变量名称解析的默认上下文 如果在 Dwoo 中您提供模板 arr foo with arr foo arr foo with 有数据 array arr gt array foo gt
  • PMA 4.5.2.0 file_exists():open_basedir 限制生效

    从 PPA 在我的 Ubuntu 服务器上安装 phpMyAdmin 后 https launchpad net nijel archive ubuntu phpmyadmin https launchpad net nijel archi
  • 智能位置表单字段

    我的用户注册表单上有一个文本字段location 我本质上希望这个字段能够根据 Google 地图 或同等地图 进行验证 只允许有效位置通过 最好采用类似的格式滑铁卢 伦敦 or 伦敦 英国 要求 除了位置名称之外 我还想返回该位置中心的坐
  • PHP 如果不存在,则从字符串中删除 ','

    我正在运行这段代码 stmt pdo conn gt prepare SELECT from admin where support emails support emails and logged logged and disabled
  • Facebook 中用户的时区是如何编码的

    我需要检查用户的时区 但我找不到它的真正定义 参考API http developers facebook com docs reference api user says 用户的时区与 UTC 的偏移量 现在在维基百科上这些是可能的时区
  • 从 PDO 准备好的语句中获取原始 SQL 查询字符串

    在准备好的语句上调用 PDOStatement execute 时 有没有办法让原始 SQL 字符串执行 出于调试目的 这将非常有用 我假设您的意思是您想要最终的 SQL 查询 并将参数值插入其中 我知道这对于调试很有用 但这不是准备好的语
  • 访客客户检查 Woocommerce 订单账单电子邮件时可享受首单折扣

    通过对照正在处理和已完成的订单检查来宾客户的电子邮件地址 如果电子邮件没有订单 我想给来宾 首单折扣 如果这能在客人输入电子邮件时发生 那就太好了 我想我已经成功制作了折扣代码 现在我请求帮助合并这两个代码 使其一切正常 这是折扣代码 ad
  • 数据表 - 服务器端处理 - 数据库列合并

    我目前正在使用 DataTables 1 10 5 服务器端处理功能 http www datatables net examples data sources server side html http www datatables ne
  • Twig:选择某些块并渲染它们

    我正在将 twig 模板引擎集成到 PHP 应用程序中 特别是 我想使用 twig 引擎来渲染表单 了解了 symfony2 如何使用 twig 渲染表单小部件后 他们有一个巨大的模板文件 其中包含所有小部件 如下所示 block pass
  • 使用php将文本文件转换为xml?

    data txt ha15rs 250 home2 gif 2 ha36gs 150 home3 gif 1 ha27se 300 home4 gif 4 ha4678 200 home5 gif 5 我想使用 php 使用 simplex
  • Yii 查询时对相关模型的限制

    我遇到了极限问题 我正在使用的代码如下 model PostCategory model record model gt with array posts gt array order gt posts createTime DESC li
  • laravel 5.4 在请求验证之前修改数据[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我有我的自定义请求 它扩展了 Backpack CrudController 现在我想重写 ValidatesWhenResolv
  • Laravel 5.3:护照实现 - {“error”:“invalid_client”,“message”:“客户端身份验证失败”}

    我按照中提到的确切步骤进行操作Laracast Laravel 5 3 的新增功能 Laravel Passport https laracasts com series whats new in laravel 5 3 episodes
  • 如何使用 PHP 获取列中的所有值?

    我一直在到处寻找这个问题 但仍然找不到解决方案 如何从 mySQL 列中获取所有值并将它们存储在数组中 例如 表名称 客户 列名称 ID 名称 行数 5 我想获取此表中所有 5 个名称的数组 我该如何去做呢 我正在使用 PHP 我试图 SE
  • asp.net cookie、身份验证和会话超时

    我有一个使用表单身份验证的 asp net 网站 我在会话中保留一些信息 例如用户名 用户 ID 电子邮件等 我通过在身份验证 cookie 上设置较长的到期日期来允许用户保持登录网站的状态 因此 当用户仍处于身份验证状态时 会话过期的情况
  • PHP简单的html dom解析器与wordpress冲突吗?

    PHP简单的html dom解析器与wordpress冲突吗 因为每当我尝试将其与此代码一起包含在我的标头中时 一切都变成空白 感谢您提前提供任何帮助 当我尝试在 HTML 文档中使用 PHP 包含时 我遇到了同样的问题 但当我使用func
  • 禁用/启用用户访问/下载,但允许 php 编辑 - 使用 chown 和 chmod

    我想 move uploaded files到某个文件夹 比方说http localhost myproject protected 并且 PHP 应该能够rm mv cp 里面的一切protected 例如 启用 禁用用户对任何文件的访问
  • php56 - CentOS - Remi 仓库

    我刚刚在测试盒上安装了 php 5 6 正常的 cli php 解释器似乎不存在 gt php v bash php command not found gt php56 v PHP 5 6 13 cli built Sep 3 2015

随机推荐

  • element-ui el-drawer组件在指定div内打开

    写在前面 element ui组件库中的el drawer默认是相对整个网页窗口呈抽屉形式打开 如果有开发需求要求在指定的div里面打开呢 具体实现 其实也很简单 核心是设置父元素position relative或absolute 再设置
  • 程序员与艺术

    没有一定的艺术修养 编程犹如累砖 真正的软件作品 终归是内心的一种艺术展现程式 或给人以恬静 或给人以震撼 总之味如嚼蜡 不如早早歇手
  • Teamviewer设置无人值守

    单机其他 选中选项 在常规项中勾选随windows一同启动 此时会弹出设置密码 设置密码后保存即可 如下图
  • 引用@webServlet时出现WebServlet cannot be resolved to a type

    新导入的项目中 已经配置好tomcat 但是引用出现了 WebServlet cannot be resolved to a type这个错误 是因为tomcat没有生成路径 选中项目 gt 右键 gt 选中Build Path gt 选中
  • windows7下安装pytorch 0.4.0 GPU版本

    1 PyTorch的官方Windows支持 2018年4月25日 PyTorch 官方发布 0 4 0 版本 该版本的PyTorch 有多项重大更新 其中最重要的改进是支持 Windows系统 Windows用户能直接通过conda pip
  • AI技术突破reCAPTCHA验证:未来挑战与应对方案

    在最近的技术突破中 人工智能 AI 已经成功地突破了reCAPTCHA验证系统 这引发了许多关于其未来是否仍然具有实际作用的讨论 reCAPTCHA是一种常见的验证码系统 旨在区分人类用户和机器人 然而 由于AI技术的不断发展和改进 传统的
  • 60级怀旧服最新服务器人口排名,魔兽世界怀旧服人口普查2019 wow怀旧服人口比例查询最新...

    魔兽世界怀旧服人口普查2019是怀旧服每个服务器玩家数量 大家想知道每个区联盟部落比利与排队人数喔 那么魔兽世界怀旧服人口普查2019在哪查询 wow怀旧服人口比例查询最新呢 跑跑车游戏网为大家带来介绍 魔兽世界怀旧服人口普查2019 9月
  • windows多个服务器之间共享文件夹,windows server 2008 R2 部署NFS,实现多台服务器间、客户端间的共享目录。...

    如何通过Windows Server 2008 R2建立NFS存储服务 通过Windows Server 2008 R2 我们可以很容易地将其作为一台NFS存储服务器 得到一个NFS软存储 轻松解决某些环境下的问题 接下来以Windows
  • RAID5容量计算方式:单块磁盘容量*(n-1)

    2017 02 07 15 05 37 RAID 5因为要容错 并行读取 就是少一个盘符的容量 容错备份用了 话说RAID 0更是减少一半盘符容量 具体的懒得自己打了 copy过来了 RAID5的可用磁盘数为 n 1 也就是说磁盘做RAID
  • ubuntu openGL入门(旧版本)

    1 环境安装 1 1
  • 导出文件之CSV格式

    import CsvExportor from csv exportor userData表格数据是从后端数据库获取来的 let csvData this userData 表头 与数据库字段一一对应 let head ID 用户名 联系人
  • Unity3D 简单待机状态图片循环淡入淡出

    说明 由于近期项目需求 在网上找了淡入淡出的代码 但都是两张图片淡入淡出结束后就没有了 可能我没找到其他好的作品 所以我做了简单的扩展 简单思路 既然待机状态下的图片淡入淡出切换 所以 首先要判断何时为待机状态 即屏幕没有任何操作的情况下
  • gdb加载so库符号失败的解决方法

    问题现象 gdb调试core文件或进程时 出现加载so库符号失败 错误信息如下 warning Could not load shared library symbols for libadd so Do you need set soli
  • VUE多页面配置

    vue config js 配置 module exports pages index page 的入口 entry src index main js 模板来源 template public index html 在 dist inde
  • 爬取杂志所有期刊的文章案例

    爬取杂志所有期刊的文章案例 前言 这次给大家带来一个简单的爬虫案例 就是爬取意林杂志所有期刊的文章 本案例网址 https www yilinzazhi com 一 分析网页 可以看出这个网站的网页很规整 而且没有反爬 每一年的期刊日期都是
  • Flutter绘制系列03---绘制图片文字

    1 绘制图片系列 因为读取图片是一个异步的操作 在读取完毕之后 需要重新渲染界面 也就是可变状态 现在要有一个概念 画布只承担绘制工作 一切数据的来源由使用者来提供 也就是将ui Image对象作为参数传递給PaperPainter 画板质
  • PowerVM 分区快速划分配置工具的使用方法

    在 PowerVM 虚拟化配置实施时 管理员经常要面对数十台物理服务器 数百个分区 如果采取手工配置与实施 工作量大 繁琐 且会造成大量的重复劳动 针对这种情况 IBM 系统科技实验室服务部推出了 PowerVM 分区快速划分与配置工具 P
  • flask - 定义API接口

    flask自行定义API接口 并且可以实现接口调试的增删查改 需要两个工具 pip install flask restful pip install flask marshmallow 初始化app 初始化app的两种方式 Api app
  • 用Python实现PDF转Word文档

    Refer to 只需2行代码 轻松将PDF转换成Word Introduce 要用Python实现PDF转Word 需要通过python内的PYMuPDF库提取PDF文件中的数据然后采用python docx库解析内容的布局 段落 图片
  • php中session超时严格控制的解决方案

    php中session默认是30分钟超时 但是有的时间压根就没到30分钟就自动超时了 这对很多操作带来不便 下面我们来看看解决30分钟超时的办法 第一种回答 最常见的一种回答是 设置Session的过期时间 也就是session gc ma