session,cookie都是跟踪整个会话过程的技术手段,会话就是用户通过浏览器和服务器的一次通话。
cookie:存储在浏览器
setcookie($name,$value,$expire,$path,$domain,$secure);
setcookie('a[b]','test');
$_COOKIE,读取cookie值
setcookie($name,'',time()-100); //删除cookie(过期)
优点:存储在客户端,不占用服务器资源;
缺点:不安全;用户可以禁用cookie;
session:存储在服务器,session是基于cookie的,需要cookie保存SessionID,如果cookie被禁用,可以通过url传递session_id。
session_start();
$_SESSION 可以添加和读取session
$_SESSION = []; //清空session
session_destroy(); //删除session文件,同时清理cookie存储的SessionID
配置:
session.auto_start
session.cookie_domain
session.cookie_lifetime
session.cookie_path
session.name //默认cookie中存储session_id的键名为 PHPSESSID
session.save_path
session.use_cookie
session.use_trans_sid
//下方为session文件垃圾回收配置(每100次调用session_start,有一次去清理最后修改时间距当前时间超过1400秒的session文件)
session.gc_probability =1
session.gc_divisor = 100
session.gc_maxlifetime = 1400
//session存储的句柄,memcache,redis,mysql
session.save_handler
优点:存储在服务器,非常安全;
缺点:占用服务器资源;
例:如果禁用cookie,如何传递SessionID?
使用url传递:<a href="1.php?<?php echo session_name().'='.session_id(); ?>">aa</a>
$sess_name = session_name();
$sess_id = $_POST[$sessname];
session_id($sess_id);//根据当前session_id获取指定session,如果session_id存在返回sessionid,若不存在返回空
session_start();
例:使用多台服务器,session存储问题
session_set_save_handle(); //可以设置session存储到mysql,redis,memcache等
cookie与session的区别:
cookie在客户端,session在服务器端
cookie在本地,可以随便修改,session更安全
cookie只支持ascII字符串,需要解码。session支持所有的数据类型。
cookie存在本地,可以永久有效。而session在服务器上,设置永久有效之后,服务器上session会不断累积,会导致内存溢出。
session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,如果主要考虑到减轻服务器性能方面,应当使用cookie。
cookie需要浏览器支持,session不支持。
cookie支持跨域,session不支持跨域。
存储量不同。