PHP会话管理和控制
Posted 飞鱼0725
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP会话管理和控制相关的知识,希望对你有一定的参考价值。
session概述
我们知道Cookie是通过将数据保存在客户端来实现与服务端保持连接的,而session是通过将数据保存在服务器端来实现保持连接的
我们之前拿开会的例子讲了一个小例子:
在几十年前人们开会的时候,都需要带上一个参会证。这个参会证上有这个人的职务、姓名、单位、照片等信息。在开会的时候,会议安保人员、组织者只需要检查相关信息就行了。
这个小例子主要说明一点,人们自己带着自己的参会证,带着自己的信息。这种模式就是cookie。
而电脑将这段cookie信息存在了电脑的硬盘里。
Cookie存在哪儿? Cookie的本质是一小段数据,一小段存储在你电脑硬盘中的数据。可是它存在哪里呢?来,我们找一下。
Chrome浏览器的Cookie文件的存放路径是:
C:Users你的用户名AppDataLocalGoogleChromeUser DataDefaultCookies
Firefox浏览器的Cookies文件存放路径是:
C:Users你的用户名AppDataRoamingMozillaFirefoxProfiles
dgp36vl.defaultcookies.sqlite 每个人可能略有不同
用文本编辑器直接打开Cookies文件看到的是乱码,我们得用工具查看,如下图:
我们来看一下需要关注的几个列,Domain代表的是cookies所属的网站,Name代表的是这个Cookie的名字,Value代表的是Cookie的值,Expires代表的是这个Cookie的有效期。
用一个我们熟悉的网站举例,tudou.com,图上我们可以看到有4个关于 tudou.com 的Cookie,那么当我们访问 tudou.com的时候,浏览器会自动把这4个Cookie的 Name 和 Value 发送到 tudou.com 这个网址所指向的服务器(PS:必须在有效期内,超出有效期的话是不会被发送到服务器的,有效期我们可以依据需求来定),如此一来,服务器就可以根据这些信息来保持与客户端的连接了,通俗点,就是可以通过这些数据来知道你就是你。当服务器收到这些Cookies后,会根据他们的值来做一些处理,做什么处理?这就取决于开发人员想根据这些信息来干嘛了!
PHP会话控制之PHP中的Cookie
这节我们通过一个用户首次登陆网站后,再次访问不需要重复输入用户名和密码的例子来学习Cookie。
首先介绍一下php中设置cookie的方法。
php中提供了一个函数来让我们设置cookie,这个函数是:
bool setcookie ( string $名字 [, string $值] [, int $过期时间 = 0] [, string $路径] [, string $域名] [, bool $安全 = false] [, bool $http只读 = false] );
参数 描述
$名字 必需。规定 cookie 的名称。
$值 可选。规定 cookie 的值。
$有效期 可选。规定 cookie 的有效期。
$路径 可选。规定 cookie 的服务器路径。
$域名 可选。规定 cookie 的域名。
$安全 可选。规定是否通过安全的 HTTPS 连接来传输 cookie。
$http安读 可选。如果true,那么js就无法读取改cookie,增加安全性。
一般来说,我们其实用不到上面那么多参数,对于这个函数,我们一般这么用: setcookie(cookie名,cookie值,cookie有效期);
没错,就那么3个。如此一来,我们就可以在服务端通过$_COOKIE[‘name‘] 来读取cookie了。
以下是示例:
我们将文件名命名为:cookie.php。
我们来模拟我们在互联网上见到最常见的例子:输入用户名和密码,登陆成功的过程。
我们来建一个数据库login,其中有表user,有username和password这两个字段。
<?php //第一次登陆的时候,通过用户输入的信息来确认用户 if ( ( $_POST[‘username‘] != null ) && ( $_POST[‘password‘] != null ) ) { $userName = $_POST[‘username‘]; $password = $_POST[‘password‘]; //从db获取用户信息 //PS:数据库连接信息改成自己的 分别为主机 数据库用户名 密码 $conn = mysqli_connect(‘localhost‘,‘root‘,‘root‘); mysqli_select_db($conn,‘test‘); $sql = "select * from user where `username` = ‘$userName‘ "; $res = mysqli_query($conn,$sql); $row = mysqli_fetch_assoc($res); if ($row[‘password‘] == $password) { //密码验证通过,设置cookies,把用户名和密码保存在客户端 setcookie(‘username‘,$userName,time()+60*60*24*30);//设置时效一个月,一个月后这个cookie失效 setcookie(‘password‘,$password,time()+60*60*24*30); //最后跳转到登录后的欢迎页面 header(‘Location: welcome.php‘ . "?username=$userName"); } } //再次访问的时候通过cookie来识别用户 if ( ($_COOKIE[‘username‘] != null) && ($_COOKIE[‘password‘] != null) ) { $userName = $_COOKIE[‘username‘]; $password = $_COOKIE[‘password‘]; //从db获取用户信息 //PS:数据库连接信息改成自己的 分别为主机 数据库用户名 密码 $conn = mysqli_connect(‘localhost‘,‘root‘,‘root‘,‘test‘); $res = mysqli_query($conn,"select * from user where `username` = ‘$userName‘ "); $row = mysqli_fetch_assoc($res); if ($row[‘password‘] == $password) { //验证通过后跳转到登录后的欢迎页面 header(‘Location: welcome.php‘ . "?username=$userName"); } } ?> <html> <head> </head> <body> <form action="" method="POST"> <div> 用户名:<input type="text" name="username" /> 密 码:<input type="text" name="password" /> <input type="submit" value="登录"> </div> </form> </body> </html>
跳转到的welcome.php代码
<?php $user = $_GET[‘username‘]; ?> <html> <head> </head> <body> welcome,<?php echo $user;?> </body> </html>
这样,当我第一次访问cookie.php的时候,我需要输入用户名和密码,输入完毕后跳转到了welcome.php。然后我关闭浏览器,再次打开cookie.php,这次没有要求我输入用户信息,而是直接跳转到了welcome.php,因为之前我们存的cookie信息被浏览器自动发送到了服务端,服务端做完处理直接跳转到了welcome.php,服务器认识我们了!知道我是之前那个登陆过的用户,这样我们就通过cookie技术让无状态的HTTP协议保持了状态。
照着这个做一遍,我相信你会用cookie了。
只不过!!!只不过!!!只不过!!!重要的事要说3遍,我们一般是不会把用户名和密码放到cookie中的,因为这并不安全,容易泄露自己的信息,请不要把重要的信息放到cookie中。我们这个只是一个学习cookie的例子。
PHP会话控制之PHP中使用session
1.开启session
首先我们要开启session,那么第一个要学习的函数就是
bool 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目录。
我的写入session的语句是:
$_SESSION[‘as‘] = ‘as‘;
解读一下,第一个as代表的是$_SESSION[‘as‘]中的as,|后面的s表示的是这是一个字符串类型的数据,2表示的是这个字符串所占的字节数,最后双引号引起来的是值as。
以上是关于PHP会话管理和控制的主要内容,如果未能解决你的问题,请参考以下文章