1.为什么要用session?

在人们访问网站的时候,有很多个网页,由于http自身的特点,用户每执行一个脚本都需要和web服务器重新建立连接。由于他们之间是无状态的,这次的连接无法得到上次连接的状态(一个脚本可能有多个网页,按网页来算)。这用,用户在一个脚本中对变量赋值,在其它的脚本中无法得到这个值。而session的作用就是一个全局变量,对session赋值在各个脚本中都可以使用。

2.session的特点

session的产生与用户(或浏览器,对同一个网站ie 和chrome会产生不同的session)服务器(或网站)都有关。不同的客户或浏览器访问相同的网站或服务器(其实是看服务器的,如果一个网站正常产品跟团购产品是放在两个服务器上,则他们的session是存在于各自的服务器上的。这种情况下就需要做session共享。)产生不同的session,相同的客户访问不同的服务器也会产生不同的session。例如A用户通过Session定义了一个全局变量$user=“wind”中,而B用户通过Session定义的全局变量$user=“jane”。那么在A用户所访问的脚本中,$user的值就是wind。

3.php中session的保存

session是以文件的形式保存在服务器端的。php.ini中有个配置项 session.save_path= "";这个里面填写的路径,将会使session文件保存在该路径下。session文件的命名格式是:"sess_[PHPSESSID]"。每一个文件里面都保存了一个会话(session)的数据。其实只要使用代码$_SESSION['user_id'] = $value;就会促发php的session机制,结果往对应的session文件中写入一个值。服务器端储存的session文件是不会删除的,只会过期。

4.session.save_path下面有很多保存的session文件,php如何知道调用哪个session文件?

在首次使用session_start()的时候会在客户端创建一个以PHPSESSID为名的cookie,例如session文件名为sess_d4heb14q4sp2rmq8m936m9ptv5,cookie的名字为PHPSESSID值为d4heb14q4sp2rmq8m936m9ptv5,这样php就知道调用哪个session文件了。

如果在服务器端删除session文件,当客户端再次访问时还是会创建与删除session文件同名的session文件。因为,在客户端访问的时候会将本地储存在cookie中的PHPSESSID值传给服务器端,服务器端根据该值来创建session文件。

但是客户端的cookie失效或者被删除后,再次访问时就会创建一个新的session文件,但服务器端就会有一个无效的session文件。所有的session文件不会被自动删掉,只是有个过期时间,以此决定:是新生成一个session文件还是使用原来的。

其实,这些都是由session_start();来实现的。session_start()已经封装了发送cookie的操作。在调用session_start()的时候会往服务器端发送本地PHPSESSID的cookie,如果存在该cookie,如果服务器端有该session文件,直接向该文件写数据,如果没有该文件这创建与该cookie同名的session文件(这才出现来删除session文件还会创建同名的session文件)。如果本地没有储存的PHPSESSID的cookie,这在本地创建一个该cookie,并且在服务器端创建该session文件。(这个地方是哪个先创建,不知)

cookie的名字PHPSESSID是可以改的,在php.ini中 session.name = PHPSESSID就是设置该cookie的名字。

session与cookie唯一的关联就是就是存储session的ID号PHPSESSID。其他,不管你设置什么cookie,使用session的时候是不会用到这些值的。也无法获取到。比如同步登陆,即使设置了cookie,你的应用也必须依据session来判断,不能基于cookie判断,cookie是可以被修改的(事实上必须如此,因为session保存在服务器端)。

5.用法

Session 是用于保持状态的基于 Web服务器的方法。Session 允许通过将对象存储在 Web服务器的内存中在整个用户会话过程中保持任何对象。

在Web上,Session的作用就是它在 Web服务器上保持用户的状态信息供在任何时间从任何页访问。因为浏览器不需要存储任何这种信息,所以任何浏览器都可以使用session来传值,保持用户的状态信息。

但是,随着越来越多用户登录,Session 所需要的服务器内存量也会不断增加。如果每个 Session 中保持许多对象,并且许多用户同时使用 Web应用程序(创建许多 Session),则用于 Session 持久性的服务器内存量可能会很大,从而影响了可伸缩性。

6.PHP Session使用过程

在应用session的时候,把session看成一个储存在服务器端的全局数组就可以来,如果你想存储一个$value值,只需要这样做$_SESSION['value'] = $value;就是一个$_SESSION的数组。

在使用session赋值之前要先使用session_start();函数,来创建session文件

在使用结束后,例如登出网站,要释放session或者销毁session。就要用session_unset();和session_destory();

因此,释放用户的session所有资源,需要顺序执行如下代码:

<?php
session_start();
session_unset(); 
session_destroy();
?>

也可以sesion_start();$a=array();$_SESSION=$a;(赋值一个空数组,即清空session)session_destroy();

有时候要用到unset();释放session中的一个变量。例如unset($_SESSION['history_user']);
session_unset()释放当前在内存中已经创建的所有$_SESSION变量,但不删除session文件以及不释放对应的session id,不需要传参数
session_destroy()删除当前用户对应的session文件以及释放session id,内存中的$_SESSION变量内容依然保留,不需要传参数

php session小节的更多相关文章

  1. Asp.NetCore1.1版本没了project.json,这样来生成跨平台包

    本章将要和大家分享的是Asp.NetCore1.1版本去掉了project.json后如何打包生成跨平台包, 为了更好跟进AspNetCore的发展,把之前用来做netcore开发的vs2015卸载后 ...

  2. 【荐】PHP Session和Cookie,Session阻塞,Session垃圾回收,Redis共享Session,不推荐Memcached保存Session

    什么是 Session 在 web 应用开发中,Session 被称为会话.主要被用于保存某个访问者的数据. 由于 HTTP 无状态的特点,服务端是不会记住客户端的,对服务端来说,每一个请求都是全新的 ...

  3. Node.js中的Session,不要觉得简单哦。

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,博客地址为http://www.cnblogs.com/jasonnode/ .学习网站上有对应 ...

  4. JAVA EE中session的理解

    转自[互动百科]http://www.baike.com/wiki/Session   Session Session:在计算机中,尤其是在网络应用中,称为“会话”.Session直接翻译成中文比较困 ...

  5. java session 详解

    原网址:http://blog.sina.com.cn/s/blog_670b6d880101deff.html 一.术语session 在我的经验里,session这个词被滥用的程度大概仅次于tra ...

  6. [转]PHP5 session 详解

    来源:http://blog.163.com/lgh_2002/blog/static/4401752620105246517509/ http协议是WEB服务器与客户 端(浏览器)相互通信的协议,它 ...

  7. Java基础-关于session的详细解释

    转自:http://hi.baidu.com/zbzbzb/item/65d73d2a4d07cfd40f37f900 一.术语session 在我的经验里,session这个词被滥用的程度大概仅次于 ...

  8. Java——Cookie与Session

    Cookie通过客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份. 1.Cookie  1.1概念及使用方法 Cookie实际上是一小段文本信息.客户端请求服务器,如果服务 ...

  9. Session机制详解

    转自:http://justsee.iteye.com/blog/1570652 虽然session机制在web应用程序中被采用已经很长时间了,但是仍然有很多人不清楚session机制的本质,以至不能 ...

随机推荐

  1. 解决mac下ssh空闲一段时间自动断开的问题

    之前在公司就遇到过这种问题,使用ssh登录linux服务器后,在后台放置一段时间,会发现会自动断开,解决的方法很简单: vim /etc/ssh/ssh_config 添加这2句即可 ServerAl ...

  2. layui的表单功能

    作为一个phper还是非常喜欢这个插件的~虽然在vue的群里面说这个插件好被人怼过..废话不多说, 这次使用到的是layui的表单功能.上次的日历忘记做笔记了非常可惜,大部分其实跟着文档撸就可以,这次 ...

  3. yii1的后台分页和列表

    控制器: public function actionIndex(){ $model = new Cases('search'); $model->unsetAttributes(); // c ...

  4. web三大组件

    1.Servlet Servlet是用来处理客户端请求的动态资源,也就是当我们在浏览器中键入一个地址回车跳转后,请求就会被发送到对应的Servlet上进行处理. Servlet的任务有: 接收请求数据 ...

  5. webstorm中.vue报错(es6语法报错)-转

    1.webstorm中es6语法报错,解决方法: 打开 Settings => Languages & Frameworks => Javascript把 Javascript L ...

  6. Lock接口和ReadWriteLock接口

    Lock接口 Lock接口在java.util.concurrent.locks包中,在jdk1.5之后才有. Lock接口有6个方法: void lock(); void lockInterrupt ...

  7. Python数据操作

    列表操作 保存matrix或者保存ndarray 数据类型转换 读取CSV某列 numpy数组写入到csv pandas to_csv 最左边 多一列 的问题 DataFrame对象操作

  8. python 读取文件使用chunksize后逐块迭代操作

    chunkers=pd.read_csv('dd.csv',chunksize=10000) tot=pd.Series([]) for piece in chunkers: tot=tot.add( ...

  9. Neutron命令测试2

    /etc/network/interfaces auto loiface lo inet loopback auto eth0iface eth0 inet manualup ifconfig $IF ...

  10. maven课程 项目管理利器-maven 5-1 课程总结 1星(2018-11-08 07:19)

    1 maven windows环境搭建和配置环境变量 2 maven骨架和pom.xml 解析 3 命令行窗口常用的maven命令 4 仓库和坐标 5 maven Java项目 6 生命周期,依赖聚合 ...