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