php中实现精确设置session过期时间的方法
大多数场景下,我们使用的是默认的session过期时间设置。对于有特殊要求的场景,我们可以灵活设置session的过期时间。在PHP中,我们可以通过修改phpi文件来实现这一需求。
在phpi文件中,有两个重要的设置:session.gc_maxlifetime和session.cookie_lifetime。其中,session.gc_maxlifetime定义了session的最大存活时间,而session.cookie_lifetime则决定了session在客户端Cookie中的存储时间。通过调整这两个参数的值,我们可以实现对session过期时间的精确控制。
除了修改phpi文件外,我们还可以在PHP程序中进行设置。例如,我们可以使用以下代码来更新session的最后一次访问时间:
```php
if(!isset($_SESSION['last_access']) || (time() - $_SESSION['last_access']) > 60) {
$_SESSION['last_access'] = time();
}
```
这样,我们就可以根据需求设置session的过期时间了。如果想要让session永不过期,我们可以将session.use_cookies设置为1,利用cookie来传递sessionid。这样,只要客户端的浏览器开着,session就会一直有效。
值得注意的是,当我们修改phpi文件后,需要重启Web服务(如Apache)才能使新的设置生效。session的回收机制是基于一定的概率进行的,这可以通过调整session.gc_probability和session.gc_divisor的值来改变。频繁地运行垃圾回收会降低PHP的效率,因此不建议通过修改这两个值来延长session的过期时间。最好的方法是修改系统环境配置,特别是phpi文件中的相关设置。
让我们设定一个超乎想象的巨大数字作为我们的目标值,怎么样,999999999,行吗?就这么定了!
接下来,我们要的是session.gc_maxlifetime。这是指Session数据在服务器端存储的时间限制,一旦超过这个时间,Session数据就会自动删除。那么,我们将其设定为一个相对较长的数值,比如99999999秒。
一切设置妥当后,你可以通过测试来验证一下。设置一个session值,过上个十天半个月再回来看看。只要你的电脑没有断电或宕机,你应该仍然可以看到这个sessionid。
如果你没有权限直接控制服务器端的phpi设置,也无需担心。我们可以利用客户端的cookie来存储sessionID。将获得的sessionID存储在客户端的cookie中,然后通过session_id()函数传递这个值。具体操作如下:
session_start(); // 启动Session
$_SESSION['count']; // 注册名为Count的Session变量
isset($PHPSESSID) ? session_id($PHPSESSID) : $PHPSESSID = session_id();
// 如果设置了$PHPSESSID,则将SessionID赋值为$PHPSESSID;否则生成新的SessionID
$_SESSION['count']++; // Session变量Count加1
setcookie('PHPSESSID', $PHPSESSID, time()+3156000); // 将SessionID存储到Cookie中
echo $count; // 显示Session变量Count的值
?>
现在让我们聊聊session失效不传递的问题。先通过一个php文件来看看服务器端的参数配置。转到session部分,查看session.use_trans_sid参数是否被设为0。这个参数决定了是否启用透明SID支持,即session是否随URL传递。如果此参数设为0,可能会导致session无法在不同页面间传递,每次页面跳转都会生成新的session文件。为了解决这个问题,可以在phpi配置文件中将session.use_trans_sid的值改为1。
但并非所有人都有权限修改php配置。那么,有没有其他方法呢?以一个实例来说明:
文件1:test1.php
// 使用用户ID作为标识的session
session_id(SID);
// 启动session
session_start();
// 设置session的name为Havi
$_SESSION['name']="Havi";
// 输出session并设置超链接到第二页test2.php
echo "".$_SESSION['name']."";
?>
文件2:test2.php
// 同样使用用户ID作为标识的session
session_id(SID);
// 启动session
session_start();
// 输出test1.php中传递的session。
echo "This is ".$_SESSION['name'];
?>
另一个可能的原因在于服务器保存session的文件夹权限问题。让我们再次关注phpinfo.php文件,查看session保存的确切地址。
该地址显示为:session.save_path: var/tmp。接下来,我们需要检查var/tmp文件夹是否具备可写权限。
为了进行测试,我们可以创建一个名为test3.php的文件,并编写以下代码:
// 检查session保存路径是否可写
$result = is_writeable(ini_get("session.save_path"));
echo var_dump($result); // 如果返回false,说明文件夹写权限受限
if ($result === false) {
// 如果当前目录下的session子文件夹具备可读可写权限,则更改session保存路径
$newSessionPath = dirname(__FILE__) . '/session/';
if (is_writeable($newSessionPath) && is_readable($newSessionPath)) {
session_save_path($newSessionPath); // 使新路径生效
}
}
?>
如果test3.php返回的结果为bool(false),那么我们就需要更改session的保存路径。可以尝试将session保存在当前目录下的'session'子文件夹中,并确保该文件夹具备可读可写的权限。通过FTP等工具,可以将该文件夹的属性设置为777,以确保读写权限。更改后,session将在新路径下保存,从而解决因权限问题导致的session保存失败问题。接下来,我们可以继续其他操作,比如渲染网页内容:
cambrian.render('body')。
编程语言
- php中实现精确设置session过期时间的方法
- 基于layui实现高级搜索(筛选)功能
- jQuery插件扩展测试实例
- CodeFirst从零开始搭建Asp.Net Core2.0网站
- JS实现发送短信验证后按钮倒计时功能(防止刷新
- .NET实现工资管理系统
- 深入理解ES6中let和闭包
- label+input实现按钮开关切换效果的实例
- ASP.NET MVC DropDownList数据绑定及使用详解
- linux centos7安装mysql8的教程
- 如何显示一个文本文件?
- JavaScript Canvas绘制圆形时钟效果
- Silverlight中同步调用WebClient的解决办法,是同步!
- 10分钟彻底搞懂Http的强制缓存和协商缓存(小结
- PHP汉字转换拼音的函数代码
- YII2.0框架行为(Behavior)深入详解