php之会话控制

php之会话控制技术

为什么要用到会话控制技术,这是因为web是通过http协议实现的,但该协议是无状态的。什么是无状态呢,就是对事物处理没有记忆功能。打个比方:当你第一次遇到陌生人,首先先自我介绍,这样对方就知道你是谁了,无状态就是这个陌生人记性不好一转身就忘了,再次相遇时他已不认识你,你又得重复介绍自己。为了保持用户的登录状态,这就需要会话控制技术了。

该技术主要有两个:cookie与session。

cookie是服务端返回客户端响应的片段信息,存储在浏览器的内存或硬盘的文件信息。

cookie的操作:

添加:setcookie($name,$value,$expire,$path,$domain,$seure)【在发送 cookie 时,cookie 的值会自动进行 URL 编码。接收时会进行 URL 解码。

        name   Cookie 名称。
      value  Cookie 值。 这个值储存于用户的电脑里,请勿储存敏感信息。 比如 name 是 'cookiename', 可通过                     $_COOKIE['cookiename'] 获取它的值。
      expire    Cookie 的过期时间。 这是个 Unix 时间戳也就是说,基本可以用 time() 函数的结果加上希望过期的秒数                                也可以用 mktime()。 time()+60*60*24*30 就是设置 Cookie 30 天后过期。 如果设置成零,或者忽略参数,                           Cookie 会在会话结束时过期(也就是关掉浏览器时)。

      path    Cookie 有效的服务器路径。 设置‘/’时,cookie对整个domain域名有效,若为‘/foo/’,仅对domain中                            的/foo/,目录及子目录有效,默认值是设置 Cookie 时的当前目录。

    domain   Cookie 的有效域名/子域名。 设置成子域名(例如 'www.example.com'),会使 Cookie 对这个子域名和它的三                      级域名有效(例如 w2.www.example.com)。 要让 Cookie 对整个域名有效(包括它的全部子域名),只要设置                      成域名就可以了(这个例子里是 'example.com')。

    secure   设置这个 Cookie 是否仅仅通过安全的 HTTPS 连接传给客户端。 设置成 TRUE 时,只有安全连接存在时才会设置                       Cookie。 如果是在服务器端处理这个需求,程序员需要仅仅在安全连接上发送此类 Cookie (通过                                            $_SERVER["HTTPS"] 判断)。
函数详见php Manual , http://php.net/manual/zh/function.setcookie.php                                                                                                                                         

注:setrawcookie() 与 setcookie() 功能几乎完全相同,不同的是不会在发往客户机时,对 cookie 值进行自动 URL 编码。

读取:超全局数组,$_COOKIE

删除:利用setcookie函数,如:setcookie($name,'',time()-100)

cookie的优缺点:存储在客户端从而减少对服务器的资源占用,同时也不利于传送重要的信息且用户可以通过浏览器禁用cookie


session:

操作:

首先开启session,利用session_start()函数,该函数会生成一个session_id,用来表示用户的ID,并返回给cookie存储。

利用$_SESSION超全局数组进行添加,操作与普通数组一致。

销毁该session文件:session_destory();

由于session保存在服务端,在php.inil可配置其相关配置;


配置:
[Session]
session.save_handler = files
session.save_path = "d:/wamp/tmp"
session.use_cookies = 1
session.name = PHPSESSID
session.auto_start = 0
session.cookie_lifetime = 0
session.serialize_handler = php
session.gc_divisor = 1000
session.gc_probability = 1
session.gc_maxlifetime = 1440
主要我们用到的,常见的大概就是这几个。我们一个一个的说。
session.save_handler = files 表示的是session的存储方式,默认的是files文件的方式保存,sess_efdsw34534efsdfsfsf3r3wrresa, 保存在 session.save_path = "d:/wamp/tmp" 里,所有这2个都是可配值得。我们上面的例子就是用的这种默认的方式。
save_handler 不仅仅只能用文件files,还可以用我们常见的memcache 和 redis 来保存。这个我们后面来说。
session.use_cookies 默认是1,表示会在浏览器里创建值为PHPSESSID的session_id,session.name = PHPSESSID 找个配置就是改这个名字的,你可以改成PHPSB, 那这样就再浏览器里生成名字为PHPSB的session_id 。`(*∩_∩*)′
session.auto_start = 0 用来是否需要自动开启session,默认是不开启的,所有我们需要在代码中用到session_start();函数开启,如果设置成1,那么session_id 也会自动就生成了。
session.cookie_lifetime = 0 这个是设置在客户端生成PHPSESSID这个cookie的过期时间,默认是0,也就是关闭浏览器就过期,下次访问,会再次生成一个session_id。所以,如果想关闭浏览器会话后,希望session信息能够保持的时间长一点,可以把这个值设置大一点,单位是秒。
gc_divisor, gc_probability, gc_maxlifetime 这3个也是配合一起使用,他们是干嘛的呢?他们是干大事情的,回收这些sess_xxxxx 的文件,它是按照这3个参数,组成的比率,来启动GC删除这些过期的sess文件。gc_maxlifetime是sess_xxx文件的过期时间。具体可以参考这个,我觉得他说我比我清楚: session的垃圾回收机制
session的垃圾回收
我们通过上面的各种,已经清楚session的种种了,它会产生各种的sess_前缀的文件,久而久之就会形成垃圾数据,而且正常的session读取也会造成压力,所以及时的清理是蛮有用的。
1. 代码处理
php代码中有几个函数是用来清理过期的session信息的,主要是这几个:
unset($_SESSION['hello']);
session_unset();
session_destroy();
setcookie(session_name(), '', time()-42000, '/');
unset 这是是常用的销毁标量的方法,不多说,唯一要说的是删除session ,就是将这个sess_xxx的文件的hello变量给删除了,其他的变量该有的都保存着。而 session_unset() 这个不穿参数,这个是销毁sess_xxx文件中的所有变量,但是这个sess_xxx文件还是保存着。而session_destroy 则更狠角了,它是直接将这个sess_xxx文件给删掉。
一般退出操作里面,我们也会将session_name() 获得到的PHPSESSID也给过期掉,删掉,因为网页没关,不这样删除的话,刷新之后,找个值是存在的,服务器将会重新创建一个一模一样session_id的sess文件。
2. php gc 自动删除
php.ini中的几个销毁sess_xxx文件的配置,在上面说了:
session.gc_divisor = 1000
session.gc_probability = 1
session.gc_maxlifetime = 1440
简单说下,其实上面的一个超链接的博客讲的很清楚了,php触发gc删除过期的sess_x的文件的概念是这样计算的:概率= gc_probability/gc_divisor,上面的默认的参数,也就是说概念是1/1000的概念,在页面启动session_start() 函数时候,会触发gc删除过期的sess_文件。这个概率其实是蛮小的

所以,我们可以将这个概念调整大一点,比如:将gc_probability 也调成1000,那gc_probability/gc_divisor 就等于1了,也就是百分一百会触发。这样就垃圾回收概率就大的多。

由于用户可以禁用cookie,而session又是基于cookie的,主要利用cookie中的PHPSESSID查找session的值来判断用户,那该如何传递sessid呢,利用两个函数:session_name 与session_id,或者SID(该常量形式‘PHPSESSID=xxxxx’相当于session_name.'='.session_id),其中若cookie中有id了,SID=‘’;(不过我试过echo SID;一直为空,无论$_COOKIE['PHPSESSID']是否有值,这就不明白了,哪里出问题了?)----哈哈,我找到了,PHP7不能用,PHP5就可以输出

如:<a href='1.php?'<?php echo session_name.'='.session_id;  ?>>点击</a>

。。。。。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值