8.6 session

1.开启session
首先我们要开启session,那么第一个要学习的函数就是

在您把用户信息存储到 PHP session 中之前,首先必须启动会话。

注释:session_start() 函数必须位于 <html> 标签之前:

<?php session_start(); ?>

<html>
<body>

</body>
</html>

 session_start()了,这个函数没有参数。在php文件的开始使用

   session_start();

就可以启用新会话或者重用现有会话了。

2.添加session数据
开启会话之后,那么在接下来的处理中,我们就可以使用$_SESSION变量来存取信息了。我们要知道的是$_SESSION变量是个数组。当我们要把信息存入session的时候应该这么写:

   $_SESSION['userName'] = 'wang';

3.读取session数据
读取很简单,就像我们使用数组一样,如下:

   $userName = $_SESSION['userName'];

当然也可以 $_SESSION['userName'] 来用。和数组一样的使用。
4.销毁session数据
我们可以使用很多种方式来销毁session数据。
a) unset函数
我们通过使用类似

   unset($_SESSION['XXX']);

来销毁session中的 XXX 变量。PS:请不要!请不要!请不要unset($_SESSION),会导致后续无法使用$_SESSION这个变量!!!

b) 空数组赋值给session变量

   $_SESSION = array();

之前我们说过$_SESSOIN变量是个数组,那么空数组赋值的话也是相当于将当前会话的$_SESSION变量中的值销毁。

c) session_destory() 函数
这个函数会销毁当前会话中的全部数据,并结束当前会话。但是不会重置当前会话所关联的全局变量, 也不会重置会话 cookie。

5.session的扩展:默认session存储在哪里。
在php.ini配置文件中有这么一行 session.save_handler = files, 
files,说明了php默认的是用文件读写的方式来保存session的。那么在哪个目录呢?继续看。session.save_path = "/tmp",
这一行前面有个 ; ,说明是被注释的,不过即便这样,php默认的
session 也是保存在这里的,/tmp目录

document_2015-08-31_55e44c8eb3e27.PNG

 我的写入session的语句是:

$_SESSION['as'] = 'as';

解读一下,第一个as代表的是$_SESSION['as']中的as,|后面的s表示的是这是一个字符串类型的数据,2表示的是这个字符串所占的字节数,最后双引号引起来的是值as。

SESSION跨页传值的问题:

首先,我们要了解,在什么状态下SESSION中的会话变量不能跨页传递。情况有三:①客户端禁用了COOKIE;②在php.ini中设置了session.use_trans_sid=0或者在编译前没有开启--enable-trans-sid选项;③浏览器出现故障,暂时无法读写COOKIE文件。

造成SESSION变量无法跨页进行传递,其原因在于SESSION储存于服务器端(默认以文件方式存储内容),根据客户端提供的session id来得到用户的文件,取得变量的值,session id可以使用客户端的Cookie或者通过HTTP协议中的URL来传达给服务器,然后服务器通过读取存储Session的目录进行变量的读取。也就是说,session id是取得存储在服务器上的SESSION变量的唯一标识。

当函数session_start()运行时,在服务器上创建一个Session文件,随之也产生了与之唯一对应的一个session id,定义Session变量以一定形式存储在已创建的Session文件中。通过session id,可以取出定义的变量。跨页后,为了使用Session,程序再次执行session _start();这将会再产生一个新的Session文件,也会与之对应产生一个新的session id,用这个session id是无法获取第一个SESSION文件中的变量的,因为这个session id并不是一个页面上的session id。如果在session_start()函数执行前添加代码session_id($session_id),将不会产生新的SESSION文件,直接读取与这个session id对应的SESSION文件。

解决无法跨页传递会话变量,通常有以下几种方法:①设置php.ini中的session.use_trans_sid=1(windows下)或者编译时选择--enable-trans-sid选项(*nix下),让PHP可以自动跨页传递session id;②自定义脚本手动通过URL传值、隐藏表单传递session id;③以外部文件或数据库的形式对session id 进行存储,每次跨页访问时进行手动调用。

php session跨页面传递 session值丢失问题之完美解决

  今天想用一个session来实现用户登录判断,也算是对之前session的探究,查了下资料session的运行机制如下:

  session是服务器端的一种会话机制,当客户端的请求服务器创建一个session时,服务器会先检测该请求里面是否包含一个惟一的sessionID,如果是,说明服务器已经为该用户创建过session,只要按照该sesionID检索出该用户的session供用户使用,如果没有sessionID,服务器会为该用户新建一个带有唯一表示服sessionID的session。创建完成后,该sessionID会被服务器返回给客户端,保存到客户端本地。

  一般保存该session ID的机制是Cookie,但是由于Cookies可以被人为禁止,这就得保证Cookies被禁止之后,仍旧可以通过session进行会话,一般是通过url重写进行,表现形式为http://...../xxx;jsessionid= ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764,另一种是作为查询字符串附加在URL后面,表现形式为http://...../xxx?jsessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764这两种方式对于用户来说是没有区别的,只是服务器在解析的时候处理的方式不同,采用第一种方式也有利于把session id的信息和正常程序参数区分开来。
为了在整个交互过程中始终保持状态,就必须在每个客户端可能请求的路径后面都包含这个session id。

另外是关于session失效的误区:

在谈论session机制的时候,常常听到这样一种误解“只要关闭浏览器,session就消失了”。其实可以想象一下会员卡的例子,除非顾客主动 对店家提出销卡,否则店家绝对不会轻易删除顾客的资料。对session来说也是一样的,除非程序通知服务器删除一个session,否则服务器会一直保 留,程序一般都是在用户做log off的时候发个指令去删除session。然而浏览器从来不会主动在关闭之前通知服务器它将要关闭,因此服务器根本不会有机会知道浏览器已经关闭,之所 以会有这种错觉,是大部分session机制都使用会话cookie来保存session id,而关闭浏览器后这个 session id就消失了,再次连接服务器时也就无法找到原来的session。如果服务器设置的cookie被保存到硬盘上,或者使用某种手段改写浏览器发出的 HTTP请求头,把原来的session id发送给服务器,则再次打开浏览器仍然能够找到原来的session。

php session跨页面传递 session值丢失问题之完美解决

恰恰是由于关闭浏览器不会导致session被删除,迫使服务器为seesion设置了一个失效时间,当距离客户端上一次使用session的时间超过这个失效时间时,服务器就可以认为客户端已经停止了活动,才会把session删除以节省存储空间。

好了,废话说了一大堆,说session丢失的解决办法吧:

1、session_start();应该尽量放置到页面的顶部;

2、如果php.ini里面没有配置 session Autostart的话,每次会话之前,都得手动开启session:session_start();

3、session是php里面的超全局变量,跟$_GET,$_POST,$_SERVER一样,所以使用的时候必须大写:$_SESSION['username']=$username;

4、跨页面传递示例:a.php页面传递$_SESSION['username']到b.php:

a.php:

<?php
session_start();
$username=$_POST['username'];
$_SESSION['username']=$username;
?>

b.php

<?php
session_start();
echo $_SESSION['username'];
?>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值