已掉线,重新登录

首页 > 绿虎论坛 > 历史版块 > 编程 > PHP > 教程

标题: PHP的SESSION

作者: @Ta

时间: 2012-12-22

点击: 6229

    SESSION是什么?
    它是一个变量。
    它是一个不会随着程序的结束而消失的变量。
    它是一个当用户下次访问时,依然能够读出上次内容的变量。
    这就是SESSION的全部。

<一、使用$_SESSION,从session_start()开始>
    session的英文含义是“会话”,是一种可以记住用户上次访问时的状态的功能。
    PHP自带的SESSION表现为一个变量:$_SESSION。就像$_GET、$_POST一样,它是一个数组,所以你可以用它存储各种不同的数据----只要用不同的KEY保存它们即可。
    不过与$_GET、$_POST等不同,$_SESSION保存的数据不会在当前页面执行完成后消失。相反,PHP会自动把SESSION数据保存在文件里,当同一个用户下次访问时,PHP便可以自动从文件中读出$_SESSION上次的值供你使用。
    然而,PHP默认是不开启SESSION功能的,你需要手动开启:
<?php
session_start();

    开启后,你便可以像使用普通变量一样使用$_SESSION了。而且和$_GET、$_POST一样,$_SESSION也是一个超全局变量,在任何地方都可以直接使用。
    当程序结束时,$_SESSION的值会自动保存,不用你再进行任何操作。
    下次用户访问时,或者用户访问同一网站的不同页面时,PHP代码只要调用session_start()便能从$_SESSION得到以前保存的数据了。
    SESSION的使用就是这样简单。具体例子就不举了,你肯定知道怎么用变量保存和读取数据,对吧。
    
<二、为什么不能使用SESSION?SESSION与Cookie>

    使用SESSION时,你可能会遇到诸多问题:
    调用了session_start(),可是$_SESSION的数据仍然不能正常保存。
    调用session_start()报错。
    原本能正常使用的SESSION,在代码经过很小的一点修改之后就不能使用了。
    我根本没改代码,只是用Windows自带的记事本打开并保存了一下,结果SESSION就不能使用了。
    还有,为什么有的浏览器能够正常使用SESSION,有的浏览器却不能呢?
    以及最后一个问题:SESSION是怎样区分不同的用户的呢?要知道,用户A和用户B在请求同一个页面时,发给服务器的请求不会有任何不同!
    除非,用户A的浏览器中保存了一个不同于用户B的Cookie。


    你的猜测很正确,PHP的SESSION确实是通过Cookie来区分不同用户的。
    当调用session_start()时,如果用户是第一次访问网站,PHP就会发送一个名称为“PHPSESSID”的Cookie给浏览器,这就是用户的唯一标识。当下次用户再访问时,PHP便能从保存在服务器上的与PHPSESSID对应的文件中读取出$_SESSION的值。
    所以,SESSION无法使用的原因通常就只有一个:PHPSESSID这个Cookie不能正常发送给用户浏览器。
        用过setCookie()或Header()函数的人都知道,它们必须在任何内容输出之前调用,否则就不会生效----因为它们影响的是HTTP头信息,而一但有了输出,PHP在发送输出内容前就已经发送了默认的HTTP头信息,这样setCookie()或Header()就错过把Cookie或自定义头信息发给浏览器的机会了。
    session_start()也一样,因为它会发送一个Cookie,所以必须在任何实际内容输出之前调用,否则SESSION就不会生效----因为PHPSESSID无法到达用户浏览器,所以用户每次访问时PHP都会认为他是第一次访问,都会为他产生一个不同于上次的PHPSESSID和SESSION文件。结果,用户每次访问都产生一个新SESSION文件,而旧的文件则永远不会被读取到。而表现出来的结果,就是用$_SESSION变量存储的数据始终无法自动保存。
    看到这里你可能就会去仔细检查代码了,看是否在session_start()之前使用了echo或其他会输出内容的函数。结果某些人发现代码中没有任何输出,SESSION还是不能用。这是为什么呢?
    如果你的PHP文件是UTF-8编码保存的,你可能就是遇到Unicode签名问题(BOM问题)了。你可以看看这篇文章。Windows的记事本会强制加BOM,所以千万别用它打开UTF-8编码的文件。
    而如果你的文件已经被加BOM了,就赶紧找个去BOM工具处理一下吧。
    
<三、与众不同----自定义SESSION>
    PHP中与SESSION相关的函数有很多,使用它们便可以自定义SESSION,比如手动设定sessionID,设定SESSION的过期时间等等。
参考http://cn2.php.net/manual/zh/ref.session.php

[隐藏样式|查看源码]


『回复列表(11|隐藏机器人聊天)』

1. 沙发
(/@Ta/2012-12-21 23:20//)

2. 温故而知新
(/@Ta/2012-12-21 23:45//)

3. 哈哈
(/@Ta/2012-12-22 06:14//)

4. @老虎会游泳,MTKqq2010不支持cookie,那这个也不支持?
(/@Ta/2012-12-22 07:15//)

5. @Mn
(/@Ta/2012-12-22 07:25//)

6. 有人说老虎是夜猫子,我相信了
(/@Ta/2012-12-22 07:47//)

7. 喜欢老虎的文章
(/@Ta/2012-12-22 09:16//)

8. 同7楼,希望老虎可以多发表一些这样的文章。
(/@Ta/2012-12-23 17:22//)

9. 还是老虎给力,顶起来给和我一样的新手学习学习。
(/@Ta/2014-11-27 18:31//)

10. 挖坟
(/@Ta/2014-11-27 18:32//)

11. @zn1228,老虎2011年的帖子都是这些
(/@Ta/2014-11-27 18:53//)

回复需要登录

9月15日 23:46 星期一

本站由hu60wap6驱动

备案号: 京ICP备18041936号-1