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. hdu2068 RPG的错排

    RPG的错排 时间限制:1000/1000 MS(Java / Others)内存限制:32768/32768 K(Java / Others)总提交内容:16421接受的提交内容:6670 问题描述 ...

  2. python 文件与异常

    ####文件### r: -只能读 不能写 -读取文件不存在,是会报错 r+: - 可以执行读写操作; - 文件不存在, 报错: w: -只能写,不能读 -会清空文件内容 -文件不存在,会新建文件 w ...

  3. 10.Web组件复用

    1.静态包含(一个指令) 在软件工程中构建可复用组件可极大的提高软件生产效率.增强系统的可维护性HTML标记对于一个web应用系统中的页面都是通用的,比如公司标志.版权声明.导航菜单JSP中引用的we ...

  4. 10-----BBS论坛

    BBS论坛(十) 10.1.客户端权限验证功能完成 (1)cms/cms_profile 显示当前用户的角色和权限 <tr> <td>角色:</td> <td ...

  5. SQL 优化通用方法

    1. 尽量避免用sub-queres, 可以采用join代替 2. exists代替in not exists 和not in 这两个的性能值得深究,应该不是差太多 3. 索引优化 4. 一些操作会导 ...

  6. Flex布局教程

    一.Flex布局是什么? Flex 是 Flexible Box 的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性.任何一个容器都可以指定为 Flex 布局. .box{ ...

  7. python_案例综合:教材记录管理

    class Book(): def __init__(self,ISBN,Ftile,Author,Publisher): self.ISBN = ISBN self.Ftile = Ftile se ...

  8. windows下修改了系统变量里java_home所引用的jdk,但是查询jdk的版本并没有发生改变

    # 原因:因为%SystemRoot%\system32 在引用这个环境变量时,会默认C:\Windows\System32下的jdk版本 # 解决方法: 把jdk的配置放在path前面就可以了

  9. inventor安装失败怎样卸载安装inventor 2014?

    AUTODESK系列软件着实令人头疼,安装失败之后不能完全卸载!!!(比如maya,cad,3dsmax等).有时手动删除注册表重装之后还是会出现各种问题,每个版本的C++Runtime和.NET f ...

  10. 读<<programming ruby>> 7.6节 flip-flop 理解

    书中源码是这样的 File.foreach('1.txt') do |x| if(($. == 1) || x =~ /eig/) .. (($. == 3) || x =~ /nin/) then ...