session_start()是session机制的开始,它有一定概率开启垃圾回收,由于session是存放在文件中
一、默认机制,用磁盘文件来实现PHP会话。
php.ini配置:session.save_handler = files
1、session_start()
A、 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”
//这是随机分级存储,这个样的话,垃圾回收将不起浸染,须要自己写脚本
B、 session会判断当前是否有$_COOKIE[session_name()];session_name()返回保存session_id的COOKIE键值,
这个值可以从php.ini找到
session.name = PHPSESSID //默认值PHPSESSID
C、 如果不存在会天生一个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,//默认为空
)
D、 如果存在那么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()返回的是新的值
HTTP协议与状态保持
HTTP协议本身是无状态的,这与HTTP协议本来的目的是符合的,客户端只须要大略的向做事器要求下载某些文件,无论是客户端还是做事器都没有必要记录彼此过去的行为,每一次要求之间都是独立的,好比一个顾客和一个自动售货机或者一个普通的(非会员制)大卖场之间的关系一样。
然而聪明(或者贪心?)的人们很快创造如果能够供应一些按需天生的动态信息会使web变得更加有用,就像给有线电视加上点播功能一样。这种需求一方面迫使HTML逐步添加了表单、脚本、DOM等客户端行为,另一方面在做事器端则涌现了CGI规范以相应客户真个动态要求,作为传输载体的HTTP协议也添加了文件上载、cookie这些特性。个中cookie的浸染便是为理解决HTTP协议无状态的毛病所作出的努力。至于后来涌现的session机制则是又一种在客户端与做事器之间保持状态的办理方案。
让我们用几个例子来描述一下cookie和session机制之间的差异与联系。笔者曾常常去的一家咖啡店有喝5杯咖啡免费赠一杯咖啡的优惠,然而一次性消费5杯咖啡的机会微乎其微,这时就须要某种办法来记录某位顾客的消费数量。想象一下实在也无外乎下面的几种方案:
1、该店的店员很厉害,能记住每位顾客的消费数量,只要顾客一走进咖啡店,店员就知道该怎么对待了。这种做法便是协议本身支持状态。
2、发给顾客一张卡片,上面记录开花费的数量,一样平常还有个有效期限。每次消费时,如果顾客出示这张卡片,则这次消费就会与以前或往后的消费相联系起来。这种做法便是在客户端保持状态。
3、发给顾客一张会员卡,除了卡号之外什么信息也不记录,每次消费时,如果顾客出示该卡片,则店员在店里的记录本上找到这个卡号对应的记录添加一些消费信息。这种做法便是在做事器端保持状态。
由于HTTP协议是无状态的,而出于各类考虑也不肯望使之成为有状态的,因此,后面两种方案就成为现实的选择。详细来说cookie机制采取的是在客户端保持状态的方案,而session机制采取的是在做事器端保持状态的方案。同时我们也看到,由于采取做事器端保持状态的方案在客户端也须要保存一个标识,以是session机制可能须要借助于cookie机制来达到保存标识的目的,但实际上它还有其他选择。
HttpSession常见问题(在本小节中session的含义为⑤和⑥的稠浊)
1、session在何时被创建
一个常见的误解是以为session在有客户端访问时就被创建,然而事实是直到某server端程序调用HttpServletRequest.getSession(true)这样的语句时才被创建,把稳如果JSP没有显示的利用 <%@page session=\"大众false\"大众%> 关闭session,则JSP文件在编译成Servlet时将会自动加上这样一条语句HttpSession session = HttpServletRequest.getSession(true);这也是JSP中隐含的session工具的来历。
由于session会花费内存资源,因此,如果不打算利用session,该当在所有的JSP中关闭它。
2、session何时被删除
综合前面的谈论,session不才列情形下被删除a.程序调用HttpSession.invalidate();或b.间隔上一次收到客户端发送的session id韶光间隔超过了session的超时设置;或c.做事器进程被停滞(非持久session)
3、如何做到在浏览器关闭时删除session
严格的讲,做不到这一点。可以做一点努力的办法是在所有的客户端页面里利用javascript代码window.oncolose来监视浏览器的关闭动作,然后向做事器发送一个要求来删除session。但是对付浏览器崩溃或者强行杀去世进程这些非常规手段仍旧无能为力。
4、有个HttpSessionListener是怎么回事
你可以创建这样的listener去监控session的创建和销毁事宜,使得在发生这样的事宜时你可以做一些相应的事情。把稳是session的创建和销毁动作触发listener,而不是相反。类似的与HttpSession有关的listener还有HttpSessionBindingListener,HttpSessionActivationListener和HttpSessionAttributeListener。
5、存放在session中的工具必须是可序列化的吗
不是必需的。哀求工具可序列化只是为了session能够在集群中被复制或者能够持久保存或者在必要时server能够暂时把session交流出内存。在Weblogic Server的session中放置一个不可序列化的工具在掌握台上会收到一个警告。我所用过的某个iPlanet版本如果session中有不可序列化的工具,在session销毁时会有一个Exception,很奇怪。
6、如何才能精确的搪塞客户端禁止cookie的可能性
对所有的URL利用URL重写,包括超链接,form的action,和重定向的URL,详细做法拜会[6]
http://e-docs.bea.com/wls/docs70/webapp/sessions.html#100770
7、开两个浏览器窗口访问运用程序会利用同一个session还是不同的session
拜会第三小节对cookie的谈论,对session来说是只认id不认人,因此不同的浏览器,不同的窗口打开办法以及不同的cookie存储办法都会对这个问题的答案有影响。
8、如何防止用户打开两个浏览器窗口操作导致的session混乱
这个问题与防止表单多次提交是类似的,可以通过设置客户真个令牌来办理。便是在做事器每次天生一个不同的id返回给客户端,同时保存在session里,客户端提交表单时必须把这个id也返回做事器,程序首先比较返回的id与保存在session里的值是否同等,如果不一致则解释本次操作已经被提交过了。可以参看《J2EE核心模式》关于表示层模式的部分。须要把稳的是对付利用javascript window.open打开的窗口,一样平常不设置这个id,或者利用单独的id,以防主窗口无法操作,建议不要再window.open打开的窗口里做修正操作,这样就可以不用设置。
9、为什么在Weblogic Server中改变session的值后要重新调用一次session.setValue
做这个动作紧张是为了在集议论况中提示Weblogic Server session中的值发生了改变,须要向其他做事器进程复制新的session值。
10、为什么session不见了
打消session正常失落效的成分之外,做事器本身的可能性该当是微乎其微的,虽然笔者在iPlanet6SP1加多少补丁的Solaris版本上倒也碰着过;浏览器插件的可能性次之,笔者也碰着过3721插件造成的问题;理论上防火墙或者代理做事器在cookie处理上也有可能会涌现问题。
涌现这一问题的大部分缘故原由都是程序的缺点,最常见的便是在一个运用程序中去访问其余一个运用程序。我们不才一节谈论这个问题。
关注微信"大众号:php开拓案例,更多精彩等你来