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会话管理和控制的主要内容,如果未能解决你的问题,请参考以下文章

PHP会话管理和控制

控制台命令上的PHP会话丢失

(实用篇)php通过会话控制实现身份验证实例

PHP 会话控制

会话控制

理解PHP中的会话控制