简单PHP会话(session)说明介绍
现在程序员愈发的不容易了,想要精通,必然要寻本溯源,这其实与目前泛滥的愈发高级的语言以及众多的框架刚好相反,因为它们在尽可能的掩盖本源使其简单,个人称之为程序员学习悖论。
注:作者接触web开发和php两周左右,以下内容适合初学者。
1、导读
从文题目看,<简单PHP会话(Session)说明>是已经圈定了本文的内容范围,试图阐明Session(文中对会话称为Session)在PHP语言中是如何实现以及使用的,重点在于基本理解后的使用。
文章思路是首先搞清楚session是什么东西,Session有什么用,Session使用的套路是什么,PHP中是如何使用的。
2、会话(Session)说明
开始前,首先推荐一本基础理论书《HTTP权威指南》,是程序员基础必备知识,作者有电子版,有需要的可以留言。
a.Session的由来
几乎每个人都上网,数以亿计的数据在网络中相互传输,数据之所以能够安全的传输,是基于HTTP协议的,很是耳熟能详是吧。其实HTTP协议所干的事情就是提供完成你的网络访问一系列方法,双方构建了一次访问,原则上就是一个会话建立了。说一个例子:小明在浏览器中输入https://www.baidu.com/(HTTPS是HTTP的加密版本,相比是增加了SSL加密层),这是小明对百度发起了一个请求,说:“我要看你的界面”,百度的服务器们收到信息,信息中包括了小名想干的事情,同时包括了小明的地址(否则百度不知道把内容给谁了),服务器核对信息OK,对小明这个请求进行备案,发送出小名想要的东西,一次完整的请求结束了。这就是一次会话,会话的核心在于小明的信息备案(其实还涉及到TCP/IP的连接问题,这个与本文无关,忽略)。
其实与其说是构建了一个Session,倒不如说将一次访问概括为一个Session。
b.Session能干什么用
从上面内容可以得到,每一个访问都是一个会话,服务器都要备案信息,这是有开销的,同时呢,也不大可能同一个人连续访问十次二十次就构建保存十次二十次,一个是增加开销,另一个是也比较蠢了。也就是说,一个人(确切说是同一个电脑和浏览器),在某个特定时间内,能够复用一个Session的,为什么在特定时间内呢?因为Session是有默认的过期时间,过期后服务器就清理掉了(如果不这样,你想想世界那么多人,来一个保留一个,太亏)。
ok,既然同一个人,多次访问都是一个Session(不要怀疑服务器无法判别是同一个人,具体可以看上面推介的书),而且每次访问的内容都是做备案的,那么也就是说,你Session周期内所有的行为服务器都是知道的,那么接下来重要的作用就来了,服务器通过对你的访问请求分析,能够获知到这个特定用户的行为偏好的,通过做一定的分析,能够推送一些用户喜欢关心的数据,广告定向也就是这么来的。
当然可能还有其他的用户,性能等等之类的,个人不是特别理解机理,这里就这样。
3、PHP中Session的使用
通过上面的啰嗦,可以发现,Session这个概念其实是在服务器端发生的。PHP提供了一系列的配置、函数等,很好的实现Session功能。Session支持在PHP中是在并发访问时由一个方法来保存某些数据.从而使你能够构建更多的定制程序从而提高你的web网站的吸引力.一个访问者访问你的web网站将被分配一个唯一的id,就是所谓的sessionid.这个id可以存储在用户端的一个cookie中,也可以通过URL进行传递.会话支持允许你将请求中的数据保存在超全局数组$_SESSION中.当一个访问者访问你的网站,PHP将自动检查(如果session.auto_start被设置为1)或者在你要求下检查(明确通过session_start()或者隐式通过session_register())当前sessionid是否是先前发送的请求创建.如果是这种情况,那么先前保存的环境将被重建.
a.php中session基本用法
通过为每个独立用户分配唯一的SessionID,可以实现针对不同用户分别存储数据的功能。会话通常被用来在多个页面请求之间保存及共享信息。一般来说,SessionID通过cookie的方式发送到浏览器,并且在服务器端也是通过会话ID来取回会话中的数据。如果请求中不包含会话ID信息,那么PHP就会创建一个新的Session,并为新创建的Session分配新的ID。
Session的工作流程很简单。当开始一个Session时,PHP会尝试从请求中查找SessionID(通常通过Sessioncookie),如果请求中不包含SessionID信息,PHP就会创建一个新的Session。Session开始之后,PHP就会将Session中的数据设置到$_SESSION变量中。当PHP停止的时候,它会自动读取$_SESSION中的内容,并将其进行序列化,然后发送给会话保存管理器器来进行保存。默认情况下,PHP使用内置的文件Session保存管理器(files)来完成Session的保存。也可以通过配置项session.save_handler(php.ini中配置项目)来修改所要采用的Session保存管理器。对于文件Session保存管理器,Session会话数据保存到配置项session.save_path(php.ini中配置项目)所指定的位置。可以通过调用函数session_start来手动开始一个会话。如果配置项session.auto_start设置为1,那么请求开始的时候,Session会自动开始。PHP脚本执行完毕之后,session会自动关闭。同时,也可以通过调用函数session_wirte_close()来手动关闭会话。
b.php中session信息在php.ini中配置
这部分内容放在这里说是因为,不说明前面问题,鬼知道php.ini中的配置是什么东西。上面提到的session.save_handler和session.save_path,这两个就是php.ini中的配置项目,这里面这块不细说,因为php手册实在是太详细了。本文默认模式是files。
c.php中的session机制
session_start()是session机制的开始,session会判断当前是否有$_COOKIE[session_name()];session_name()返回保存session_id的COOKIE键值,如果不存在会生成一个session_id,然后把生成的session_id作为COOKIE的值传递到客户端.相当于执行了下面COOKIE操作。相反,如果存在session_id=$_COOKIE[session_name];然后去session.save_path指定的文件夹里去找名字为'SESS_'.session_id()的文件.读取文件的内容反序列化,然后放到$_SESSION中。
在会话结束的时候,会执行Session写入操作或是手工执行session_write_close()操作。
代码里面销毁Session一般有三个方法,
1.setcookie(session_name(),session_id(),time()-8000000,..);//退出登录前执行
2.usset($_SESSION);//这会删除所有的$_SESSION数据,刷新后,有COOKIE传过来,但是没有数据。
3.session_destroy();//删除$_SESSION删除session文件以及session_id
附录,引用网络上的一段代码,作为结尾吧。
<spanstyle="white-space:pre"></span>//SESSION初始化的时候调用 functionopen($save_path,$session_name) { global$sess_save_path; $sess_save_path=$save_path; return(true); } //关闭的时候调用 functionclose() { return(true); } functionread($id) { global$sess_save_path; $sess_file="$sess_save_path/sess_$id"; return(string)@file_get_contents($sess_file); } //脚本执行结束之前,执行写入操作 functionwrite($id,$sess_data) { 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); } } functiondestroy($id) { global$sess_save_path; $sess_file="$sess_save_path/sess_$id"; return(@unlink($sess_file)); } functiongc($maxlifetime) { global$sess_save_path; foreach(glob("$sess_save_path/sess_*")as$filename){ if(filemtime($filename)+$maxlifetime<time()){ @unlink($filename); } } returntrue; }
以上这篇简单PHP会话(session)说明介绍就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。