1. session 与 cookie 的区别与联系是什么?
session 能存各种数据类型。 cookie 只能存字符串。
$_SESSION 的下标只能是字符串。 $_cookie 的下标也是。
联系:session 的 id 存在 cookie 中。
2. session 的生命周期是?
浏览器关闭。默认的cookie生存周期是浏览器关闭。
3. 如何持久化 session ?
设置保存 sessionID 的 cookie 生存周期。
两种写法:
a:
session_start();
setcookie(‘PHPSESSID‘, session_id(), time()+3600); // 要写在后面
注:session_id() 可以获得当前的 sessionID 。
b:
session_set_cookie_params(3600, ‘/‘, ‘baidu.com‘); // 要写在前面
session_start();
注:
服务器端垃圾回收的时间,应该和 session 持久化时间一致!配置 php.ini:
session.gc_maxlifetime = 3600
其实,session 持久化不常用,因为持久化就持久化两方面,一个是浏览器端 cookie ,一个是服务器端的 sessionDATA ,这样 sessionDATA 会很多。
4. cookie 禁用,session 能否使用?
可用。
session 基于 cookie,cookie 不可用,典型的情况是 session 也不可用。
cookie不能带数据,可以使用 get 参数把数据带到服务器。使用 get 参数来传递 PHPSESSID 。不安全。只要带上 get 参数,就不用登录了。这个参数是自动生成的。而且,是在用户浏览器禁用 cookie 后才会有。没禁用,而我又配置了 php.ini 如下,那么优先使用 cookie 。
需要配置 php.ini:
session.use_only_cookies = 0 // 允许从url传递PHPSESSID, 不用cookie
session.use_trans_sid = 1 // 使用url传递sessionID
注:
1. php 只会自动的在 html 的 a 标签的 href 链接上增加 PHPSESSID 参数。header("Location: ");上的不行。php 代码内的地址不行。但,可以自己写上去:
header("Location: test1.php?PHPSESSID=".session_id());
2. 如果是通过表单跳转的话,是通过 post 方式传递信息的。这时,php 会自动生成一个隐藏域。name = "PHPSESSID" , value = "session_id()"