您的位置:首页 > 编程语言 > PHP开发

php cookie session

2012-11-22 00:03 232 查看
cookie
cookie是保存在客户端的,每个浏览器保存的位置也不一样,客户端可以通过js修改cookie,php通过setcookie修改cookie
cookie常用于识别用户,因为http请求是无状态的,cookie给一个标识位,让服务端知道是谁请求的(ps 这个要和session配合 seession是记录在服务器端)
cookie还可以存储一些简单的数据,ps cookie很小 存不了多少,存起来不合算啊 据说cookie过大会引起页面响应很慢(据说 无从考证)
php操作cookie的相关方法
$_COOKIE 是以个cookie的集合 是数组
可以这样取cookie里面的值 $_COOKIE["a"] a是key,value是$_COOKIE["a"],因为$_COOKIE是数组,所以可以foreach遍历它
setcookie int setcookie(string name,string value,int expire,string path,string domain,int secure)
参数说明举例
name某个cookie的key调用是 用$_COOKIE["name"] name为名字
value对应某个cookie的key 的value$_COOKIE['name']就是指了
expireCookie 过期的时间。这是个 Unix 时间戳,即从 Unix 纪元开始的秒数。换而言之,通常用 time() 函数再加上秒数来设定 cookie 的失效期。或者用 mktime()来实现。当不使用这个参数的时候,关闭浏览器这个cookie就会消失.如:setcookie("a","a"),关闭浏览器 a=a这个cookie就消失了

当设置1个小时后过期 可以这么写setcookie("a","a",time()+60*60)

如果要到具体的某个时间过期可以 这么写$t = mktime(0,0,0,1,1,2013);setcookie(’name’, ‘bret’, $t);到2013.1.1 00:00:00 过期

如果要设置cookie马上过期 可以这么写 setcookie("a","a",time()-100),因为有些cookie不是当前目录下面设置的,所以上面的写法师清除不掉的,可以从艮目录上清除,setcookie("a","a",time()-100,"/")

pathCookie 在服务器端的有效路径。如果该参数设为 '/' 的话,cookie 就在整个 domain 内有效,如果设为 '/foo/',cookie 就只在 domain 下的 /foo/ 目录及其子目录内有效,例如 /foo/bar/。默认值为设定 cookie 的当前目录了

如果没有设置改参数,在同级目录下是可见的, 不同级别的目录不可见

domain该 cookie 有效的域名。要使 cookie 能在如 example.com 域名下的所有子域都有效的话,该参数应该设为'.example.com'。虽然 . 并不必须的,但加上它会兼容更多的浏览器。
session
PHP session 变量用于存储有关用户会话的信息,或更改用户会话的设置。Session 变量保存的信息是单一用户的,并且可供应用程序中的所有页面使用
Session 的工作机制是:为每个访问者创建一个唯一的 id (UID),并基于这个 UID 来存储变量。UID 存储在 cookie 中,亦或通过 URL 进行传导。

要使用session 必须先启动回话 session_start() session_start() 函数必须位于<html> 标签之前

当第一次打开session_start()的时候,在tmp目录下会生成一个sess_xxxx的东西(它会存储当前用户设置了session的一些东西),然后返回一个cookie给客户端加入cookie值是skommgd1oql6mhme2hj91b8c93, 这个值是唯一的,在tmp下的文件就叫sess_skommgd1oql6mhme2hj91b8c93

比如在php里面设置了$_SESSION["name"] = "hi world!"; sess_xxxx里面就会加上name|s:9:"hi world!";

当php页面开启了session_start()的时候, 每次 http请求,都会访问sess_xxxx, 如果不存在sess_xxxx就会新建一个

php判断一个http请求是否和会话的文件是否对应,用的是http请求里面的cookie的 PHPSESSID的 值 比如是skommgd1oql6mhme2hj91b8c93,去查找tmp/目录下是否有与之对应的文件,如果有,就算是启动了session,可以取session里面的东西

在pho.ini里面有一个叫session.name的东西 他可以修改cookie里面的表示key 比如写成 session.name = yuanfang ,在客户端传过来cookie的标识就变成yuanfang=xxxxxxx

要给session设置过期,打开php.ini文件,session.gc_maxlifetime=1400 这个修改下 ,可以设置session过期的时间.网上说用setcookie可以设置session过期, 我觉得这是不对的,setcookie只是把cookie里面的PHPSESSID 过期的了, 然后传过来的http请求就没有这个cookie,服务端就不知道这个请求是谁的了,但是session会话还是存在的,所以只要重新设置那个cookie,又相当于建立了会话
当你修改了session.gc_maxlifetime为10秒,不要以为就真的过期了,很可能session还是存在的,PHP会根据全局变量session.gc_probability/session.gc_divisor(同样可以通过php.ini或者ini_set()函数来修改)的值,来决定是否启动一个GC(Garbage Collector)

默认情况下,session.gc_probability = 1,session.gc_divisor =100,也就是说有1%的可能性会启动GC

也就是说1/100的几率 当设置session过期后 会把sess_xxxx的文件删除掉 当sess_xxxx清除掉的时候 才能算是会话周期结束了

亲自测试 设置了 session.gc_probability = 1,session.gc_divisor =1 sess_xxx还是没删除 会话还是存在 我是越来越不懂了

session要搞清楚 看来不是很容易的事情
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: