今天边肖给大家分享一个对PHP会话机制的理解和举例。边肖觉得内容挺好的,现在分享给大家,很有参考价值。有需要的朋友一起看看吧。
PHP有两种保存方式:session.save_handler=files和session.save_handler=user。PHP保存的具体方式可以通过配置php.ini文件来实现。
一、使用读写文件的方式保存 SESSION 数据(session.save_handler = files)
1、 session_start()
(1).SESSION_start()是会话机制的开始。启动垃圾回收是有一定概率的,因为会话是存储在文件中的,PHP自己的垃圾回收是无效的。会话的垃圾收集是删除文件。这个概率是根据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 _ divider的结果的1/1000,
//不建议设置太小,因为session的垃圾收集需要检查每个文件是否过期。
Session.save_path=//好像默认不同系统不一样。一个设置是‘n;/path
//这是随机分层存储。在这种情况下,垃圾收集将不起作用,您需要编写自己的脚本。
(2).会话将确定当前是否有$ _ COOKIE[session _ name()];Session_name()返回保存session_id的COOKIE的键值,可以从php.ini中找到
Session.name=PHPSESSID //默认值PHPSESSID
(3).如果不存在,会生成一个session_id,然后生成的session_id会作为COOKIE的值传递给客户端。
它相当于执行下面的COOKIE操作。注意,这一步执行setCOOKIE()操作,COOKIE在头中发送。在此之前不能有输出。PHP还有一个函数session_regenerate_id(),如果使用这个函数,在此之前不能有输出。
setcookie(session_name(),
会话标识(),
Session.cookie_lifetime,默认为//0
Session.cookie_path,//default/在当前程序和目录中有效。
Session.cookie_domain,//默认为空
)
(4).如果存在,则session _ id=$ _ cookie[session _ name];然后转到session.save_path指定的文件夹,找到名为“sessis _”的文件。会话标识();读取文件的内容被反序列化,然后放入$_SESSION。
2、为$_SESSION赋值
比如添加一个新值$ _ SESSION[ test ]= blah ;那么这个$_SESSION将只在内存中维护。脚本完成后,将$_SESSION的值写入session_id指定的文件夹,然后关闭相关资源。
在这个阶段,可以执行改变SESSION_id的操作,比如销毁一个旧的session_id,生成一个全新的session_id,其中一半用于自定义会话操作和角色转换。比如Drupal的匿名用户。Drupal有一个会话,登录时需要使用一个新的session_id。
if(isset($ _ COOKIE[会话名称()]){
setcookie(session_name(),,time() - 42000,/);//旧的会话cookie过期
}
session _ regenerate _ id();//此步骤将生成一个新的session_id
//session_id()返回新值。
3、写入SESSION操作
脚本最后会执行SESSION写操作,将$_SESSION的值写入到以session_id命名的文件中,这个文件可能已经存在,可能需要新建一个文件。
4、销毁SESSION
SESSION发出的cookie一般都是即时cookie,存储在内存中,只有关闭浏览器才会过期。如果需要人工强制过期,比如注销而不是关闭浏览器,就需要在代码中销毁SESSION。方法有很多。
setcookie(session_name(),session_id(),time() - 8000000,);//注销前执行。
usset($ _ SESSION);//这将删除所有$_SESSION数据。刷新后,有COOKIE来,但没有数据。
session _ destroy();//这个功能更彻底。Delete $_SESSION删除会话文件,以及session_id。
当你不关闭你的浏览器时,再次刷新它。COOKIE将从它们两个发送,但是找不到数据。
二、自定议session处理机制(session.save_handler = user)
用户自定义的会话处理机制更加直观。
* session _ set _ save _ handler( open , close , read , write , destroy , gc ).
1、session_start()
执行打开($保存路径,$会话名称)打开会议操作句柄;$保存路径在session.save_handler=文件的情况下它就是会话。保存路径,但是如果用户自定的话,这个两个参数都用不上,直接返回真实的
执行已读($id)从中读取数据;这个参数是自动传递的就是会话标识(),可以通过这个值进行操作。
2、脚本执行结束
执行
写入($id,$sess_data) //两个参数,很简单
3、假如用户需要session_destroy()
先执行摧毁。在执行第2步
一个实际例子:
//会话初始化的时候调用
函数打开($保存路径,$会话名称)
{
全局$ sess _ save _ path
$ sess _ save _ path=$ save _ path
返回(真);
}
//关闭的时候调用
函数关闭()
{
返回(真);
}
函数读取($id)
{
全局$ sess _ save _ path
$ sess _ file= $ sess _ save _ path/sess _ $ id ;
return(string)@ file _ get _ contents($ sess _ file);
}
//脚本执行结束之前,执行写入操作
函数写入($id,$sess_data)
{
回声“标清FSF”;
全局$ 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
}否则{
返回(假);
}
}
函数销毁($id)
{
全局$ sess _ save _ path
$ sess _ file= $ sess _ save _ path/sess _ $ id ;
return(@ unlink($ sess _ file));
}
函数垃圾收集器(最大生命周期)
{
全局$ sess _ save _ path
foreach(glob( $ sess _ save _ path/sess _ * as $ filename){
if(文件时间($文件名)$最大生存时间()){
@ unlink($ filename);
}
}
返回真实的
}
补充——涉及函数
session_start()。//开启会议回话,其中会话标识()的值是一次独立会话的标志
会话名称();//默认是PHPSESSID,在php.ini文件中可以自行配置。
会话标识();//在甜饼干中的体现是,会话名称为键,会话身份证明(identification)为值
设置cookie();//要想起作用,必须有页面的刷新
session _ destory();//session_destroy —销毁一个会话中的全部数据
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。如果你想了解更多相关内容请查看下面相关链接