热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

php会话技术-session与cookie

PHP中提供了这样的数据形式。在请求之间可以共享数据,并且不通过地址栏传递数据。这类的数据称之为会话数据

PHP中提供了这样的数据形式。在请求之间可以共享数据,并且不通过地址栏传递数据。这类的数据称之为 会话数据。

使用会话数据:

一:开启会话机制

通常情况下,我们的会话机制 不是默认开启的,需要手动的开启。(可以通过修改php.ini内的配置session.auto_start 达到自动开启的目的)。 利用php函数session_start()也可完成。通常没有参数。 

session

二:使用超级全局数据变量$_SESSION 来引用会话变量即可。

session技术

我们利用 session数据 增加一个标志:

Privilege.php act=signin

php技术博客

在index.php内判断这个标志:

Admin/index.php

php学习博客

Session的使用非常简单,就类似 常规数组一样使用即可,只不过 使用前应该先 :session_start(); 

理解session:

注意:

Php所有的变量都是脚本级别的? 脚本结束时,变量都被销毁。

$_SESSION 也是一个变量, 意味着 脚本结束也应该被释放。

为什么 在$_SESSION内保存的数据,可以被传递到下一个请求脚本呢?

这是因为  $_SESSION在被销毁前 将其中数据 保存到某个地方,而在session_start()的时候,又将数据从某个地方获取到,然后放入到$_SESSION数组内。  这样 看上去 $_SESSION可以传递到下个页面,但是其实是经历 保存数据- 销毁->创建->获得数据的过程。

会话数据 可以保存到下一次请求,那么什么时候数据会丢失呢?

数据丢失 是发生在浏览器被关闭时。也就是说 会话数据的有效期 是会话结束(浏览器关闭,就是会话结束)。

会话数据,在会话期间内有效的数据 就是会话数据。会话 指的是 浏览器与服务器之间 产生的一次对话。

服务器 是 如何 识别浏览器的?

在第一次请求是:

php会话技术

以后的请求:

session_id

我们发现, 浏览器会携带这个标志 来请求服务器,这样 服务器就能 识别出来 是不是 同一个浏览器的请求。(标志相同 即为 同一个浏览器)

以上的  标志ID  称之为 SESSION ID。

服务器 会为不同的sessionID生成不同的数据保存空间(不同的文件)

大家思考好下面的两个问题:会话解决的两个问题:

One: 如何让服务器能够识别固定的浏览器?(因为,基于http的访问,是无状态的,多次访问直接间没有任何关系)

Two:如何能够在多个请求脚本之间传递数据?(因为:PHP的变量都是请求脚本级别的,脚本运行结束,变量全都释放)

服务器在浏览器上做了个记号,将某个特殊的数据保存到浏览器上。那么 就意味着 

服务器是否可以在浏览器上保存数据?可以

服务器保存到浏览器上的数据,在浏览器发出请求时会不会带到服务器端?能

那么这个操作,服务器在浏览器上 保存数据的操作 是什么技术完成的? 是采用 COOKIE技术完成的。

COOKIE变量的有效期:

默认的COOKIE变量的有效期是 浏览器关闭。

就导致 session的id是保存在COOKIE内的,一旦关闭浏览器 COOKIE失效,同时 COOKIE内的session_id失效,导致 session失效。

但是通常情况下 我们都更改COOKIE变量的有效期,达到数据长时间保存的目的。

利用 setCOOKIE函数的第三个参数来达到效果:

有效期指的是一个到期时间,使用时间戳来表示。

SetCOOKIE(‘变量名’, ‘变量值’, 有效期);

例如 将COOKIE变量保存一个小时:

当前的时间戳 + 3600s即可。

Time()获得当前的时间戳

COOKIE

保存2周:

php-COOKIE

COOKIE保存到浏览器端,区别与不同的浏览器 保存形式是不一致的:

例如火狐就是以 sqlite数据库 保存COOKIE的:

利用session技术,完成用户登录功能:

在登录成功后 将 当前管理员的信息保存到 session中,在判断时判断是否有管理员信息

Privilege.php act=signin

会话技术的使用

在index.php内判断

会话技术

由于后台的操作 都需要对用户的session验证,因此都需要session_start(),应该将session——start()放到一个公共的地方:

/admin/includes/init.php

php技术博客

Session的详细使用:

$_SESSION不能使用整型下标。

session详细说明

但是 如果数值下标出现在$_SESSION元素内,则没有问题

session

$_SESSION是可以保存数组的。

$_SESSION内也可以保存对象

php博客

但是 使用session内的对象时 需要找到对象所属的类 才可以。

php技术

既然session可以保存多种类型的数据,而且在使用时,数据类型不丢失。那意味着一定会有一个序列化的过程,将特殊的数据类型 保存起来。才可以。

通过查看sesssion文件内容可以知道,session内的数据 也是按照某种序列化的格式完成的 数据转换。

session

当浏览器关闭,session失效(COOKIE内的sessionID没有了),但是服务器上保存session

的数据文件是否还存在?存在 (这个文件就没有用了)

如何删除 保存session数据的服务器端文件呢?

利用这个函数Session_destroy();完成。

php技术

注意 

此方法会删除相关文件,但是 COOKIE内的 sessionID是不会消失的。

此方法会删除相关文件,但是 脚本周期内的 $_SESSION变量内的数据是不会消失的。

如何删除session相关的所有数据?(如何完全删除一个session?)

$_SESSION  是PHP脚本内使用的session数组 

清空:这里,不能unset($_SESSION); 应该清空此变量的内容 $_SESSION= array();

删除:$_COOKIE[‘PHPSESSID’] COOKIE内的sessionID。

删除一个COOKIE变量。SetCOOKIE(‘PHPSESSID’, ‘’, time()-1)

删除:Sess_asefasdfasfdasfasfasdfasdf 服务器端保存session数据的文件

Session_destroy();

1.删除 本次回话的数据    $_SESSION = array();  

2.删除COOKIE里面的   phpsessionid   SetCOOKIE(‘PHPSESSID’, ‘’, time() -1); 

3.删除session文件      Session_destroy();  

如果大家是 wamp集成环境的话,session文件的位置 不再 c:/windows/temp

会在:Wamp/tmp

我们可以通过配置 php.ini内的.Session.save_path,修改这个值默认为 操作系统的临时目录:

修改下:

session_save_path

 

session

问题:一旦 session目录内的session文件很多的话,在同一个文件夹下 很多文件。

文件过多,意味着 在文件内检索某个文件的操作变慢。所以我们的php可以将 session文件 分成子目录来保存。解决目录内 文件过多的问题。

1, 设置将session文件保存成多目录

修改 session.save_path的配置,设置 采用几级子目录:

session

2, 手动建立这些子目录。

php学习

session会根据当前的sessionID的值,选取使用哪个子目录保存session文件

session

如果采用的是多级子目录的话,采取sessionid的相应字母作为子目录的名称。

题:大家可以写一个php脚本,自动地创建 session需要的子目录。

但是 在实际开发中,还是很少采用以上的方法 来解决网站的大量session数据的问题。

现在的瓶颈是 文件系统的 文件访问 速度是相对较慢的。

我们想办法 将 session数据 保存在一个 相对读取和写入速度比较块的地方。 在实际的开发中,我们通常都将 session数据保存在内存中。

除了保存到内存中,还有一个可以采取的方法,保存到数据库里。

这个内容 参考session 入库文章

问题:

       1  如果浏览器的COOKIE不能使用,那么session技术能够使用么? 如果在COOKIE不能用的前提下,非要使用session技术,能不能达到效果,如果能 提出解决方案。

       2   session数据的有效期是什么?(浏览器关闭) 为什么? 如果需要在浏览器关闭后 还能继续保存session的值的话,应该做哪些工作?

    3 session与COOKIE的区别?

如果浏览器端COOKIE不能用了,那么session还可以使用么?

Session和COOKIE的联系:session的sessionID是以COOKIE的形式保存在浏览器端。

如果COOKIE不能用了,意味着 不能COOKIE去保存sessionID。

所以,只要想办法 能够让浏览器 携带 sessionID 请求即可.. 只要在请求数据内携带 sessionID即可。

请求数据:也称服务器的外部数据,通常使用GPC表示(get post COOKIE)。

通常 我们在COOKIE不能用的情况下 采用 get方式来传递这个sessionID。意味着 在每次请求后 都需要增加一个参数PHPSESSIN=xafafdasfdasnflajsldfalfs

Php内部支持 自动地为 所有的a标签的href属性 增加一个sessionID的参数,需要使用配php .ini置达到效果:

Session.use_trans_sid, 是否在url上传输sessionID,启用他:

session教程

Session.use_only_COOKIE 是否仅仅使用COOKIE来保存sessionID。 关闭这个特性:

session笔记

当修改了上面的配置后,如果浏览器禁用了 COOKIE 那么, php会在所有的 a标签内增加 sessionID的传输:

禁用浏览器COOKIE功能(不同浏览器不同方法):

php技术博客

Ie: 

ie关闭session

结果:

session

注意 php只会在html内不自动增加 PHPSESSID参数,在脚本内不能:

因此 如果类似利用 header(‘Loction:128.php’)这类的代码完成跳转的话,需要手动增加 session参数

此时 可以利用 session_name() 和 session_id()分别获得sessionID的变量名和sessionID的值

session详细使用

还可以在 删除sessionID的COOKIE变量时 使用这个函数

SetCOOKIE(session_name(), ‘’, time()-1);

如何增加session的有效期?

Session的默认有效期是浏览器关闭。那是因为 保存在COOKIE内的sessionID丢失了。

因此 如果需要增加session的有效期,也只能在COOKIE的sesionID上做文章 增加COOKIE内sessionID的有效期。

利用setCOOKIE就可以达到目的:

COOKIE的使用

同样工作 还可以使用配置完成:

session笔记

还可以利用函数:

php技术博客

注意 上面的三个做法 是同一个功能,只需要一个即可。

但是 上面的操作只是修改了COOKIE内的PHPSESSID的有效期, 但是 保存在服务器上的sessionID数据 还有可能失效.需要修改 session.gc_maxlifetime来增加 sessionI数据的有效期。

完成以上两步 才能完全将session的有效期延长。

Session COOKIE 的区别:

数据保存位置不同

生存周期

安全性

请求时 携带的数据量不同


推荐阅读
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文内容为asp.net微信公众平台开发的目录汇总,包括数据库设计、多层架构框架搭建和入口实现、微信消息封装及反射赋值、关注事件、用户记录、回复文本消息、图文消息、服务搭建(接入)、自定义菜单等。同时提供了示例代码和相关的后台管理功能。内容涵盖了多个方面,适合综合运用。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 禁止程序接收鼠标事件的工具_VNC Viewer for Mac(远程桌面工具)免费版
    VNCViewerforMac是一款运行在Mac平台上的远程桌面工具,vncviewermac版可以帮助您使用Mac的键盘和鼠标来控制远程计算机,操作简 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文讲述了作者通过点火测试男友的性格和承受能力,以考验婚姻问题。作者故意不安慰男友并再次点火,观察他的反应。这个行为是善意的玩人,旨在了解男友的性格和避免婚姻问题。 ... [详细]
  • 本文介绍了使用PHP实现断点续传乱序合并文件的方法和源码。由于网络原因,文件需要分割成多个部分发送,因此无法按顺序接收。文章中提供了merge2.php的源码,通过使用shuffle函数打乱文件读取顺序,实现了乱序合并文件的功能。同时,还介绍了filesize、glob、unlink、fopen等相关函数的使用。阅读本文可以了解如何使用PHP实现断点续传乱序合并文件的具体步骤。 ... [详细]
author-avatar
贪婪黑夜面_780
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有