php.ini里面开启会话功能,PHP - 会话处理

HTTP(超文本传输协议)定义了通过万维网传输文本、图形、视频和所有其他数据所用的规则。HTTP是一种无状态的协议,也就是每次请求都是独立的,和之前或之后的请求无关。但有时候应用需要能够调整用户特有的行为和选择。为修复这一问题,出现了一种在客户端机器上存储少量信息的方案(cookie),但cookie大小的限制、所允许的数量等问题促使开发人员提出了另一种解决方案:会话处理(session)。

会话处理实际上是无状态问题的一种更聪明的解决办法。它的实现方式是为每闰网站访问者分配一个称为会话ID(SID)的唯一标识属性,然后将此SID与任意数量的数据关联。但在HTTP无状态的行为下,SID如何持续地与某个用户关联呢?可以通过两种办法实现:

1.cookie

当用户访问网站时,服务器将用户的SID存储在 cookie

中。客户在浏览网站时,在必要的时候,页面使用和SID相关的各项数据。因此,即使会话结束,cookie

也能在客户端保存,所以可以在后续会话中读取,但如果客户端禁用了cookie或清空了cookie 这个方案就无效了。

2.url重写

第二种用一SID传播的方法是在每个请求页面的URL上增加SID。无论用户何时单击这些链接,都会在链接中通过 get

方式将SID传回服务端。这样,即使禁用了 cookie

,也不会影响会话处理功能的正常使用。但这咱方法也有缺陷。首先,URL重写在会话之间不能保证持久性,因为用户一旦离开网站,向URL自动追回SID的过程就无法再持续。其实,如果用户将SID发给另一个用户,两人就能共用同一个会话的信息了,安全性上很低。

会话存储:

会话过程中的一些信息如何存储,是可以配置的,在php.ini中配置如下:

session.save_handler = files|mm|sqlite|user

四种方法分别是:文件,内存,SQLite数据库,用户定义函数。默认是在文件中。会话存储文件的数量可能会达到几千,甚至几十万。共享内存管理会话速度最快,但也最不可靠。SQLITE会在本地建一个数据库文件来进行存储;用户函数是最方便,灵活的一种,它可以让用户自己定义一个方法,在这个方法里,用户可以将信息存在任何媒介上。

如果用户设置的是files,将信息存在文件上,那么可能会设置文件的目录:

session.save_path = /abc

默认地址是:/tmp

会话开启:

PHP中调用函数:session_start()来开启会话。不过如果要在网站中一直使用会话,也可以设置:session.auto_start

指令,设置为 1 来自动启动会话。0 表示不开启,默认是 0.

但如果要在 session 中存储类的对象,自动开启就不能用了,因为类的结构要在会话开始前就要加载。

设置会话名称:

PHP默认使用 PHPSESSID 来获得会话中的一些信息。但也可以更改这个默认值:

session.name = mysessionname

如何选择上面两种方案:

如果要在多次访问网站之间维护用户会话信息,就应当使用 cookie

,这样服务端能重新得到SID,继续原来的会话。如果只用于一次访问期间,那么URL重写就足够了。

session.use_cookies = 0|1 可以表示选用哪种方式,设置为 1 表示使用cookie

进行SID传播,0表示URL重写。启用 cookie

设置时,不需要我们手动去调用set_cookie()去设置,会话函数会自己处理。当然,不同传值方式对应的接收值方法也不同。分别是:

$_COOKIE['sid'] 和 $_GET['sid']

当然,也能通过$_REQUEST 这个超级全局变量获得cookie

信息,如:$_REQUEST['sid']获得SID。它的作用和前面两个是一样的。但为了代码易读,还是用上面区分比较好。

如果use_cookies 被设置为 0 .用户唯一的SID必须放在URL后面通过 get

方式传到服务端。但这种方法太过危险。PHP里提供另一种方案,让PHP自动去做:

session.use_trans_sid = 0|1 设置成 1 即可。

开始会话:

HTTP会忘记用户过去和将来的环境,因此,需要对每次请求显式的启动或恢复会话,这是通过:session_start()函数完成的。它会返回一个布尔值。该方法会创建一个新的会话或继续当前的会话,这取决于是否拥有SID。该方法永远会返回成功,任何异常处理都不起作用。

销毁会话:

session过期后,会自动销毁,我们也可以手动销毁:session_unset()

这个方法会清空会话中的内容,但这个会话本身还是存在的,如果想连会话也销毁,可以用:

session_destory();

设置和获得会话ID

SID

是将会话数据和用户绑定的唯一标识。前面提到了,PHP可以自动传播它,不用我们显式的写,但有时候我们也需要设置和获得它,这是通过如下方法实现的:

session_id(mySID);

如果不传参数,它会返回当前的会话ID,如果有参数,当前的会话ID会被替换。

会话应用实例:

已登录用户自动登录

经常会有这样的应用:用户登录后离开该站点,下次回来的时候直接进入,不需要再输入用户名和密码。

PHP 实现这个比较简单。因为这里涉及到的是多次会话,所以要用上面说的 cookie 传值法。我们先将php.ini

中如此设置:session.use_cookies =

1,然后再将会话过期时间设置长一点:session.cookie_lifetime = 360000 ,此值默认是

0,单位是秒,表示页面关闭后就过期。

进行如上设置后,在用户登录的页面上先开启session,然后在会话中存入一变量:

$_SESSION['username'] = 'test user';

这样,信息就存入会话中了。用户关闭页面,再次进入页面时,因为cookie 已开启,PHP会自动从 cookie

中获得SID,并设置给当前会话。然后我们只需要开启会话,再判断会话中是否存在 username 变量值即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值