1.在同一次会话中,所有的session信息都会保存在一个文件名类似为sess_4e28e33e7c5d3371c173b28163afd8bd(sess_加32位随机字母与数字组成的字符串)的自动随机命名的文件信息中。因为http会为每一次php页面中的session_start()请求都会创建一个sessionID,而又开启了cookie后,浏览器返回的Cookie:PHPSESSID(可以使用网页数据分析工具HttpWatch抓取查看)会与session_start()创建的sessionID相等,信息及时衔接,所以在服务器端一次会话只会创建一个session文件,该session文件包含了所有当前会话的信息。
禁用cookie后,浏览器的确会在服务器端创建一个session文件,这时候这个session文件也会将PHPSESSID信息返回给浏览器,但是这个时候浏览器已经不能接收这样的信息了。这意味着,当浏览器再次发送另外的session_start()信息的时候就不会带PHPSESSID的值了,因此,当前页面就无法找到原来已经创建的session文件,就会重新自动创建新的session文件。如此一来,每次执行session_start()都会有新的session文件产生,即一次会话就会产生多个session文件,会话信息就不能实现共享。 那么,如何解决这个问题呢?只要把sessionID传递回服务器即可。
这里提供下面三种方法:
1.在每个超链接上添加一个PHPSESSID=sessionID值,同时在每个页面加上类似如下(伪)代码:if(isset($_GET['PHPSESSID'])){ //设置session_id session_id($_GET['PHPSESSID']); } session_start(); . . .
2.使用系统常量SID:在超链接action header('Location:xx')可以直接拼接SID常量如echo "<a href='ShopProcess.php?bookid=001&bookname=细说PHP&".SID."'>细说PHP</a>";
3. 直接配置php.ini文件。将php.ini文件里的session.use_trans_sid= 0设为1,重启apache即可生效(这样在href action header提供的地址后面会自动加SID,但是js的跳转不会自动加SID)。