1.session.save_handler = files
* 1. session_start()
1. session_start()是session机制的开始,它有一定概率开启垃圾回收,因为session是存放在文件中,
PHP自身的垃圾回收是无效的,SESSION的回收是要删文件的,这个概率是根据php.ini的配置决定的,
但是有的系统是 session.gc_probability = 0,这也就是说概率是0,而是通过cron脚本来实现垃圾回收。
session.gc_probability = 1
session.gc_divisor = 1000
session.gc_maxlifetime = 1440//过期时间 默认24分钟
//概率是 session.gc_probability/session.gc_divisor 结果 1/1000,
//不建议设置过小,因为session的垃圾回收,是需要检查每个文件是否过期的。
session.save_path = //好像不同的系统默认不一样,有一种设置是 "N;/path"
//这是随机分级存储,这个样的话,垃圾回收将不起作用,需要自己写脚本
2. session会判断当前是否有$_COOKIE[session_name()];session_name()返回保存session_id的COOKIE键值,
这个值可以从php.ini找到
session.name = PHPSESSID //默认值PHPSESSID
3. 如果不存在会生成一个session_id,然后把生成的session_id作为COOKIE的值传递到客户端.
相当于执行了下面COOKIE 操作,注意的是,这一步执行了setcookie()操作,COOKIE是在header头中发送的,
这之前是不能有输出的,PHP有另外一个函数 session_regenerate_id() 如果使用这个函数,这之前也是不能有输出的。
setcookie(session_name(),
session_id(),
session.cookie_lifetime,//默认0
session.cookie_path,//默认'/'当前程序跟目录下都有效
session.cookie_domain,//默认为空
)
4. 如果存在那么session_id = $_COOKIE[session_name];
然后去session.save_path指定的文件夹里去找名字为'SESS_' . session_id()的文件.
读取文件的内容反序列化,然后放到$_SESSION中
* 2. 为$_SESSION赋值
比如新添加一个值$_SESSION['test'] = 'blah'; 那么这个$_SESSION只会维护在内存中,当脚本执行结束的时候,
用把$_SESSION的值写入到session_id指定的文件夹中,然后关闭相关资源. 这个阶段有可能执行更改session_id的操作,
比如销毁一个旧的的session_id,生成一个全新的session_id.一半用在自定义 session操作,角色的转换上,
比如Drupal.Drupal的匿名用户有一个SESSION的,当它登录后需要换用新的session_id
if (isset($_COOKIE[session_name()])) {
setcookie(session_name(), '', time() - 42000, '/');//旧session cookie过期
}
session_regenerate_id();//这一步会生成新的session_id
//session_id()返回的是新的值
3.写入SESSION操作
在脚本结束的时候会执行SESSION写入操作,把$_SESSION中值写入到session_id命名的文件中,可能已经存在,
可能需要创建新的文件。
* 4. 销毁SESSION
SESSION发出去的COOKIE一般属于即时COOKIE,保存在内存中,当浏览器关闭后,才会过期,假如需要人为强制过期,
比如 退出登录,而不是关闭浏览器,那么就需要在代码里销毁SESSION,方法有很多,
o 1. setcookie(session_name(), session_id(), time() - 8000000, ..);//退出登录前执行
o 2. usset($_SESSION);//这会删除所有的$_SESSION数据,刷新后,有COOKIE传过来,但是没有数据。
o 3. session_destroy();//这个作用更彻底,删除$_SESSION 删除session文件,和session_id
当不关闭浏览器的情况下,再次刷新,2和3都会有COOKIE传过来,但是找不到数据
2.session.save_handler = user
用户自定义session处理机制,更加直观
* session_set_save_handler('open', 'close', 'read', 'write', 'destroy', 'gc');
1.session_start(),
执行open($save_path, $session_name)打开session操作句柄
$save_path 在session.save_handler = files的情况下它就是session.save_path,
但是如果用户自定的话,这个两个参数都用不上,直接返回TRUE
执行read($id)从中读取数据.//这个参数是自动传递的就是session_id(),可以通过这个值进行操作。
* 2.脚本执行结束
执行write($id, $sess_data) //两个参数,很简单
* 3.假如用户需要session_destroy()
先执行destroy.在执行第2步
一个实际例子:
//SESSION初始化的时候调用
function open($save_path, $session_name)
{
global $sess_save_path;
$sess_save_path = $save_path;
return(true);
}
//关闭的时候调用
function close()
{
return(true);
}
function read($id)
{
global $sess_save_path;
$sess_file = "$sess_save_path/sess_$id";
return (string) @file_get_contents($sess_file);
}
//脚本执行结束之前,执行写入操作
function write($id, $sess_data)
{
echo "sdfsf";
global $sess_save_path;
$sess_file = "$sess_save_path/sess_$id";
if ($fp = @fopen($sess_file, "w")) {
$return = fwrite($fp, $sess_data);
fclose($fp);
return $return;
} else {
return(false);
}
}
function destroy($id)
{
global $sess_save_path;
$sess_file = "$sess_save_path/sess_$id";
return(@unlink($sess_file));
}
function gc($maxlifetime)
{
global $sess_save_path;
foreach (glob("$sess_save_path/sess_*") as $filename) {
if (filemtime($filename) + $maxlifetime < time()) {
@unlink($filename);
}
}
return true;
}
温馨提示:内容为网友见解,仅供参考
PHP session干嘛用的?举个简单易懂的例子
session是一个会话,以数组形式存在,并且有一定的有效期,存储在服务器端,而且,他的最大的特性就是具有唯一性!所谓的唯一性,就是说,在不同的客户端访问,session的值是不相同的。常用于记录用户的个人信息,比如网站的登录等!session写入后,在有效期内,无需其他操作即可在同一网站中的任何一个...
PHP中$_SESSION的作用域是什么?怎样设置$_SESSION的作用域?
_SESSION['test'] 会话 相当于类似 全局变量一样的功能, 做 登陆的话 可以保存 一登陆状态 链接到新网页
php中$_SESSION["key"]问题
意思就是当$_SESSION["key"]==1的时候,就是用户已经登陆的时候,显示退出管理 如果等于其他的时候,就是用户没有登陆的时候 显示 我要管理
php session是什么意思
PHP session是什么意思?在使用PHP编程时,session是指服务器保存在内存或磁盘中的数据对象,供客户端和服务器端之间进行数据交互。具体来说,当用户访问网站时,服务器会在内存或磁盘上创建一个session对象,然后将其与一个唯一的session ID相关联。这个session ID可以通过cookie或URL进行传递,从而实现不同...
php中Session使用方法详解
PHP默认使用基于Cookie的Session,SessionID存储于客户端Cookie。在注销时需清除Cookie中的SessionID,使用setCookie()函数实现。PHP中session.auto_start选项允许自动启动会话,但限制了类对象在会话中的使用。Session具有自动回收机制,通过设置session.gc_maxlifetime,系统在指定时间后自动删除未被引用的Session...
PHP 中用session时出现: Undefined index: MM_username in
$_POST,$_GET..)需要检测变量是否已经设置。使用$uname = isset($_SESSION['MM_username']) ? $_SESSION['MM_username'] : '';而不是$uname = $_SESSION['MM_username'];当然实际项目中往往是屏蔽notice信息的,使用error_reporting(E_ALL ^ E_NOTICE);或者在php.ini里作相应修改即可。
关于php 的 $_SESSION 变量 覆盖问题?
SESSION 可以理解为这个用户当前会话独立拥有的数据,会话结束这些数据都会不存在了,每一个用户的SESSION数据都是独立的 你前面赋了值,后面页面都会取得到,如果后面再赋新的值,原有的值也就改变了,效率不会有什么影响的的
怎么理解PHP Session的用法 生命周期 过期时间
具体到Web中的Session指的就是用户在浏览某个网站时,从进入网站到浏览器关闭所经过的这段时间,也就是用户浏览这个网站所花费的时间。因此从上述的定义中我们可以看到,Session实际上是一个特定的时间概念。需要注意的是,一个Session的概念需要包括特定的客户端,特定的服务器端以及不中断的操作时间。A...
$_SESSION[]问题
_SESSION=['admin']="OK";这一句应该是 _SESSION['admin']="OK";_SESSION[]是PHP中的会话变量.admin变不是你数据库中的.而是你自己随便定义的.你这里改成什么都可以.只要后面和这里一样就成 SESSION会话是用于页面之间的传值.也就是说你在这里将'OK'赋值给了$_SESSION['admin']那么你以后就...
php SESSION用法 $_SESSION['']初始值
_SESSION数组的使用类似于普通数组。但它是有”魔法“的。当页面结束后,$_SESSION的内容会被PHP解析器自动保存下来,同时在用户的浏览器留下一个cookie。下次用户访问时,使用该cookie继续会话。所以,检查一个session是否存在和普通数组一样:<?php\/\/ 正确,检查flag下标是否设置if (isset($_SESSION['...