乐趣区

PHP面试常考之会话控制

你好,是我琉忆,欢迎您来到 PHP 面试专栏。本周(2019.2-25 至 3 -1)的一三五更新的文章如下:

周一:PHP 面试常考之会话控制周三:PHP 面试常考之网络协议周五:PHP 面试常考题之会话控制和网络协议

以下正文的内容来自《PHP 程序员面试笔试宝典》书籍,如果转载请保留出处:

最近是换工作潮自己刻意“汇总整理了 11 篇带解析的 PHP 面试题的文档”,已上传百度云,关注公众号:“琉忆编程库”,回复:“php”,下载链接我发给你。
一、session
PHP 的会话也称为 Session。PHP 在操作 Session 时,当用户登录或访问一些初始页面时服务器会为客户端分配一个 SessionID。SessionID 是一个加密的随机数字,在 Session 的生命周期中保存在客户端。它可以保存在用户机器的 Cookie 中,也可以通过 URL 在网络中进行传输。
用户通过 SessionID 可以注册一些特殊的变量,称为会话变量,这些变量的数据保存在服务器端。在一次特定的网站连接中,如果客户端可以通过 Cookie 或 URL 找到 SessionID,那么服务器就可以根据客户端传来的 SessionID 访问会话保存在服务器端的会话变量。
Session 的生命周期只在一次特定的网站连接中有效,当关闭浏览器后,Session 会自动失效,之前注册的会话变量也不能再使用。具体的使用步骤如下:
1)初始化会话。在实现会话功能之前必须要初始化会话,初始化会话使用 session_start() 函数。
bool session_start(void)

该函数将检查 SessionID 是否存在,如果不存在,则创建一个,并且能够使用预定义数组 $_SESSION 进行访问。如果启动会话成功,则函数返回 TRUE,否则返回 FALSE。会话启动后就可以载入该会话已经注册的会话变量以便使用。2)注册会话变量。自 PHP 4.1 以后,会话变量保存在预定义数组 $_SESSION 中,所以可以以直接定义数组单元的方式来定义一个会话变量,格式如下:
$_SESSION[“ 键名 ”]=” 值 ”;

会话变量定义后被记录在服务器中,并对该变量的值进行跟踪,直到会话结束或手动注销该变量。3)访问会话变量。要在一个脚本中访问会话变量,首先要使用 session_start() 函数启动一个会话。之后就可以使用 $_SESSION 数组访问该变量了。4)销毁会话变量。会话变量使用完后,删除已经注册的会话变量以减少对服务器资源的占用。删除会话变量使用 unset() 函数,语法格式如下:
void unset(mixed $var [, mixed $var [, $…]])

说明:$var 是要销毁的变量,可以销毁一个或多个变量。要一次销毁所有的会话变量,使用 session_unset();。5)销毁会话。使用完一个会话后,要注销对应的会话变量,然后再调用 session_destroy() 函数销毁会话,语法格式如下:
bool session_destroy (void)

该函数将删除会话的所有数据并清除 SessionID,关闭该会话。

最近是换工作潮自己刻意“汇总整理了 11 篇带解析的 PHP 面试题的文档”,已上传百度云,关注公众号:“琉忆编程库”,回复:“php”,下载链接我发给你。

二、cookie
Cookie 可以用来存储用户名、密码、访问该站点的次数等信息。在访问某个网站时,Cookie 将 html 网页发送到浏览器中的小段信息以脚本的形式保存在客户端的计算机上。
一般来说,Cookie 通过 HTTP Headers 从服务器端返回浏览器。首先,服务器端在响应中利用 Set Cookie Header 来创建一个 Cookie。然后浏览器在请求中通过 Cookie Header 包含这个已经创建的 Cookie,并且将它返回至服务器,从而完成浏览器的验证。
Cookie 技术有很多局限性,例如:1)多人共用一台计算机,Cookie 数据容易泄露。2)一个站点存储的 Cookie 信息有限。3)有些浏览器不支持 Cookie。4)用户可以通过设置浏览器选项来禁用 Cookie。正是由于以上 Cookie 的一些局限性,所以,在进行会话管理时,SessionID 通常会选择 Cookie 和 URL 两种方式来保存,而不是只保存在 Cookie 中。
具体而言,Cookie 的使用步骤如下:1)创建 Cookie。在 PHP 中创建 Cookie 使用 setcookie() 函数,语法格式如下:
bool setcookie(string $name [, string $value [, int $expire [, string $path [, string $domain [, bool $secure [, bool $httponly]]]]]])

① $name:表示 Cookie 的名字。② $value:表示 Cookie 的值,该值保存在客户端,所以不要保存比较敏感的数据。③ $expire:表示 Cookie 过期的时间,这是一个 UNIX 时间戳,即从 UNIX 纪元开始的秒数。对于 $expire 的设置一般通过当前时间戳加上相应的秒数来决定。例如,time()+1200 表示 Cookie 将在 20min 后失效。如果不设置则 Cookie 将在浏览器关闭之后失效。④ $path:表示 Cookie 在服务器上的有效路径。默认值为设定 Cookie 的当前目录。⑤ $domain:表示 Cookie 在服务器上的有效域名。例如,要使 Cookie 能在 example.com 域名下的所有子域都有效,该参数应设为 ”.example.com”。
2)访问 Cookie。通过 setcookie() 函数创建的 Cookie 是作为数组的单元,存放在预定义变量 $_COOKIE 中。也就是说,直接对 $_COOKIE 数组单元进行赋值也可以创建 Cookie。但 $_COOKIE 数组创建的 Cookie 在会话结束后就会失效。
3)删除 Cookie。Cookie 在创建时指定了一个过期时间,如果到了过期时间,那么 Cookie 将自动被删除。在 PHP 中没有专门删除 Cookie 的函数。如果为了安全方面的考虑,在 Cookie 过期之前就想删除 Cookie,那么可以使用 setcookie() 函数或 $_COOKIE 数组将已知 Cookie 的值设为空。示例代码如下:
<?php
$_COOKIE[“user”]=”administrator”;
setcookie(“password”,”123456″,time()+3600);
$_COOKIE[“user”]=””; // 使用 $_COOKIE 清除 Cookie
setcookie(“password”,””); // 使用 setcookie() 函数清除 Cookie
print_r($_COOKIE); // 输出:Array ([user] => )
?>

Cookie 和 Session 都是用来实现会话机制的,由于 HTTP 协议是无状态的,所以要想跟踪一个用户在同一个网站之间不同页面的状态,需要有一个机制,称为会话机制。

预告:本周三更新 PHP 面试常考之网络协议,敬请期待。
以上内容摘自《PHP 程序员面试笔试宝典》书籍,该书已在天猫、京东、当当等电商平台销售。更多 PHP 相关的面试知识、考题可以关注公众号获取:琉忆编程库
对本文有什么问题或建议都可以进行留言,我将不断完善追求极致,感谢你们的支持。

退出移动版