php会话技术

一、COOKIE

1、cookie概述

(1)什么是cookie?

  • COOKIE是一种会话技术
  • 简单来说,Cookies就是服务器暂时存放在你的电脑里的资料(.txt格式的文本文件),好让服务器用来辨认你的计算机(通常经过加密)
  • Cookie是由服务器端生成,发送给User-Agent(一般是浏览器),浏览器会将Cookie的key/value保存到某个目录下的文本文件内,下次请求同一网站时就发送该Cookie给服务器
  • Cookie名称和值可以由服务器端开发者定义,这样服务器可以知道该用户是否是合法用户以及是否需要重新登录等,服务器可以设置或读取Cookies中包含信息,借此维护用户跟服务器会话中的状态

(2)使用cookie的好处

  • 用户登录时,记住登录账号和密码,为下一次登录时简化操作
  • 另一个重要应用场合是“购物车”之类处理。用户可能会在一段时间内在同一家网站的不同页面中选择不同的商品,这些信息都会写入Cookies,以便在最后付款时提取信息
  • 跟踪统计用户访问网站的习惯。什么时间访问,访问了哪些页面,页面停留时间等,为用户提供个性化服务,为网站营销提供参考

2、cookie操作

(1)添加cookie数据

  • 描述:向客户端发送一个 HTTP cookie
  • 语法:bool setcookie ( string $name [, string $value [, int $expire = 0 [, string $path [, string $domain [, bool $secure = false [, bool $httponly = false ]]]]]] )
  • 参数:
    • $name,cookie的名称
    • $value,cookie的值,会自动进行 URL 编码。接收时会进行 URL 解码。COOKIE值的类型只能是标量数据类型,不可是数组、对象、资源
    • $expire,cookie的有效期
    • $path,cookie的服务器路径
    • $domain,cookie的域名
    • $secure,规定是否通过安全的 HTTPS 连接来传输 cookie
    • $httponly设置哪些程序可以使用COOKIE
  • 返回:设置成功返回TRUE,失败返回FALSE
//添加cookie数据:告诉浏览器将cookie存储到本地电脑
//当前cookie的过期时间为关闭浏览器
setcookie("username", "admin");
setcookie("password", "123456");

(2)读取cookie数据

  • 描述:获取cookie数据是通过超全局数组$_COOKIE来实现的
  • 语法:value = $_COOKIE[key]
//打印$_COOKIE数组
//读取指定cookie数据
echo "用户名:" . $_COOKIE['username'];
echo "<br>密码:" . $_COOKIE['password'];

3、cookie设置

(1)cookie过期时间

① 即时性cookie设置

  • 描述:默认cookie的有效期是关闭浏览器时,自动失效。该cookie称为临时cookie
  • 语法:bool setcookie ( string $name , string $value [, int $expire = 0 ])
  • 参数:$expire可选,指定cookie保存的时间,默认为0,关闭浏览器失效
//添加cookie数据:告诉浏览器将cookie存储到本地电脑
//当前cookie的过期时间为关闭浏览器
setcookie("username", "张三丰");
setcookie("password", "123456");

② 有效性cookie设置

  • 语法: bool setcookie ( string $name , string $value [, int $expire = 0 ])
  • 参数:$expire可选,指定cookie保存的时间,默认为0,关闭浏览器失效
  • 说明:$expire为一个时间戳。一般用time()+N表示新的时间戳。在当前时间点,再加上N秒后,产生一个新的时间戳
  • 提示:一旦指定了有效的过期时间,cookie失效跟关闭浏览器无关(持久cookie)
//当前cookie的过期时间为1小时
setcookie("username", "admin", time() + 3600);
setcookie("password", "123456", time() + 3600);

③ 永久性cookie设置

  • 描述:将PHP最大整数常量设置为COOKIE过期时间
  • 语法:bool setcookie ( string $name [, string $value [, int $expire = 0]] )
  • 参数:$expire指定为PHP最大整数常量PHP_INT_MAX的值
//添加cookie数据,设置过期时间为php最大整数
setcookie("username", "admin", PHP_INT_MAX);
setcookie("password", "123456", PHP_INT_MAX);//2038年1月19日11:14:07

(2)cookie路径有效性

  • 描述:设置COOKIE只能在指定的目录及其子目录下有效
  • 语法:bool setcookie ( string $name [, string $value [, int $expire = 0 [, string $path]]] )
  • 参数:$path默认为"/",代表当前网站根目录,在当前目录及其所有子目录都可以使用
  • 说明:由于浏览器每次请求时,携带到服务器端很多的COOKIE数据,会导致请求数据变得庞大;将COOKIE划分到各个路径中,减少每个路径下COOKIE的数量
  • 假设:京东网站往我们电脑写入了1万个COOKIE数据,但是,每个页面的COOKIE数量很少。如果每次请求,都把1万个COOKIE带过去,可能当前页面只需要5个COOKIE,则有9995个COOKIE无用。造成带宽极大浪费
//添加cookie数据:设置路径有效性
//设置cookie的有效性路径,只有访问该路径文件,cookie才带过去
setcookie("username", "admin", time() + 3600, "/php");
setcookie("password", "123456", time() + 3600, "/php");

(3)cookie域名有效性

  • 描述:给一个COOKIE指定访问的域名
  • 语法:bool setcookie ( string $name [, string $value [, int $expire = 0 [, string $path [, string $domain]]]] )
  • 提示:默认情况下,cookie只能在当前域名下有效
  • 域名划分(以自己本地站点为例):
    • 主域名:2018.cn
    • 一级域名:www.2018.cn
    • 二级域名:news.2018.cn
    • 三级域名:php.news.2018.cn
  • 说明:如果COOKIE域名有效性,设置为主域名,则在所有域名下都可以使用。如果设置为子域名,则只能在子域名下使用该COOKIE
//添加cookie数据:设置域名有效性
//如果设置为主域名,则在所有子域名下都可以用
//如果设置子域名,则只能在当前域名下使用
setcookie("username", "admin", time() + 3600, "/", "2018.cn");
setcookie("password", "123456", time() + 3600, "/", "news.2018.cn");

(4)是否仅限https才能发送cookie呢?

  • 描述:是否仅限https来发送COOKIE数据,默认情况下,为http协议发送
  • 语法:bool setcookie ( string $name [, string $value [, int $expire = 0 [, string $path [, string $domain [, bool $secure = false]]]]] )
  • https:是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL
//添加cookie数据:是否仅能使用https来发送cookie数据
//如果值为true,则只能通过https来发送cookie数据
//如果值为false,则在http和https都能发送cookie数据
setcookie("username", "admin", time() + 3600, "/", "2018.cn", true);
setcookie("password", "123456", time() + 3600, "/", "2018.cn", false);

(5)是否只能通过http协议来使用COOKIE呢?

  • 描述:客户端的COOKIE除了可以通过HTTP协议来使用外,还可以使用JS来使用COOKIE
  • 语法:bool setcookie ( string $name [, string $value [, int $expire = 0 [, string $path [, string $domain [, bool $secure = false [, bool $httponly = false ]]]]]] )
//添加cookie数据:是否仅能使用http来发送cookie数据
//如果值为true,则只能通过http来发送cookie数据
//如果值为false,则通过其它程序(如JS)发送cookie数据
setcookie("username", "admin", time() + 3600, "/", "2018.cn", false, true);
setcookie("password", "123456", time() + 3600, "/", "2018.cn", false, flase);

4、删除cookie数据

(1)设置COOKIE有效性为过去的某一个时间

  • 描述:设置有效期为过去的某一个时间
  • 语法:bool setcookie ( string $name [, string $value [, int $expire = 0 ]] )
//删除cookie数据:设置为过去的某个时间
setcookie("username", "admin", time() - 1);
setcookie("password", "123456", time() - 1);

(2)设置COOKIE的值为false或空字符串

//删除cookie数据
setcookie("username", false);
setcookie("password", false);

(3)不设置cookie的值

//删除cookie数据
setcookie("username");
setcookie("password");

(4)清理浏览器缓存

清理浏览器缓存,所有的缓存数据、COOKIE数据都会被清理掉。

二、SESSION

1、session概述

(1)什么是session?

  • Session对象存储特定用户的会话数据
  • Session将会话数据存储在服务器端
  • Session是基于Cookie技术的,没有Cookie就没有Session
  • Session在整个用户会话中,一直存在下去
  • 一个用户会话时效:从用户登录开始,到用户登录结束
  • Session存储的数据量要比cookie大的多
  • Session存储的内容类型,不限于字符串
  • Session数据存储在服务器端,更安全,可靠

(2)开启session会话功能

  • 描述:启动新会话或者重用现有会话
  • 语法:bool session_start (void )
  • 提示:$_SESSION变量默认是不存在的,与\_POST、_GET、\_FILES不一样。因此,必须先开启SESSION,才能使用_SESSION变量
  • 提示:每个需要SESSION数据的页面,都要开始SESSION功能
  • 注意:SESSION功能,不能重复开启(同一个页面不能开2次)
  • 返回:成功开始会话返回 TRUE ,反之返回 FALSE

开启session:session_start();

2、session操作

(1)添加session数据

  • 对Session的管理(增删改查),都是通过超全局数组$_SESSION进行的
  • 语法:$_SESSION[key] = value
  • 提示:一个网站不管添加多少个SESSION数据,最终在浏览器端只存储一个SESSION的ID值,该ID值是经过加密的,并且永不重复。Key只能是String类型的数据
//开启session会话
//如果当前sessID不存在,则创建新的
//如果当前sessID已存在。则启用旧的
//session不能重复开启,一个页面只需要开启一次
session_start();
//添加session数据:添加一个数组元素
//元素的值,不能是资源型,其它都可以
$_SESSION['username'] = 'admin';
$_SESSION['password'] = '123456';

(2)读取session数据

  • 语法:$value = $_SESSION[key]
  • 提示:每次SESSION操作,都要先开SESSION功能
//开启session会话
session_start();
//读取指定session数据
echo "用户名:" . $_SESSION['username'];
echo "<br>密码:" . $_SESSION['password'];

(3)删除session数据

  • 使用 unset() 函数,删除一个SESSION数据
  • 将空数组赋给\_SESSION:_SESSION = array()
//开启session会话
session_start();
//删除session数据
unset($_SESSION['username']);
unset($_SESSION['password']);
//将一个空数组赋给$_SESSION
$_SESSION = array();

(4)销毁session文件

  • 描述:删除当前的SESSION文件,不影响其它的SESSION文件
  • 语法:bool session_destroy ( void )
//删除自己的session文件
session_destroy();

(5)获取当前sessionID和session名称

//开启session会话
session_start();
//读取指定session数据
echo "用户名:" . $_SESSION['username'];
echo "<br>密码:" . $_SESSION['password'];
echo "<br>Sess名称:" . session_name();
echo "<br>SessID:" . session_id();

3、session的配置(php.ini)

(1)修改session文件的保存位置:session.save_path

php.ini中:

;session.save_oath = "/tmp"     #在配置文件中这个一般不建议修改

(2)修改session对应的cookie名称:session.name

session.name = PHPSESSID

(3)修改session对应的cookie配置

① session对应cookie过期时间设置:session.cookie_lifetime

session.cookie_lifetime = 0
#session对应的cookie数据的过期时间,指定一个秒值即可,即应该在N秒后过期。例如:1小时秒值为3600,不使用time()+N格式

② session对应cookie有效路径设置:session.cookie_path

session.cookie_path = /
#指定cookie数据的目录有效性

③ session对应cookie域名有效性设置:session.cookie_domain

session.cookie_domain = 指定域名有效性

④ 是否仅限https来发送session对应的cookie数据:session.cookie_secure

session.cookie_secure = 是否仅限https来发送cookie数据

⑤ 是否仅限http来使用session对应的cookie数据:session.cookie_httponly

session.cookie_httponly = 是不是只能是服务器才能使用该cookie

4、session垃圾回收机制

(1)什么是session的垃圾回收机制?

  • SESSION垃圾回收, 就是将过期的SESSION服务器数据删除的机制
  • SESSION会自动删除那些过期的服务器端session数据区文件
  • 当我们登录后,没有单击“退出”按钮时,该用户对应的SESSION文件就变成了垃圾文件

(2)垃圾回收的周期:session.gc_maxlifetime

session.gc_maxlifetime = 1440  #session垃圾文件回收的最大间隔为24分钟

(3)垃圾回收的概率:session.gc_divisor

session.gc_probability = 1   #概率的分子
session.gc_divisor = 1000   #概率的分母
#如果有1000人访问了这个网站,那么,垃圾回收就会完整的清理一遍

说明:首先以24分钟为间隔,如果24分钟内,登录了100个用户,即1/10,24分钟一到,就清理前1/10的垃圾文件。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容

  • (一)会话技术简介 所谓会话技术,在php编程中指的是:浏览器向服务器发出请求,服务器做出回应,这就完成了一个会话...
    草鞋弟阅读 795评论 0 0
  • 1 概述 会话技术指的是当一个浏览器与服务器在进行对话的期间(浏览器没有关闭),各个请求不同的脚本间可以共享一些数...
    川少叶阅读 531评论 0 0
  • 目录Cookie机制什么是CookieCookie的不可跨域名性Unicode编码:保存中文BASE64编码:保存...
    Tomatoro阅读 16,878评论 7 186
  • 会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是Cookie与Se...
    chinariver阅读 5,570评论 1 49
  • 如果你都觉得你自己努力不够,那可能真的是差很多。 当有一天你的努力真的可以感动你自己的时候,那可能是你真的已经努力...
    不闹海就闹心的哪吒阅读 754评论 0 20