php session小节
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小节的更多相关文章
- Asp.NetCore1.1版本没了project.json,这样来生成跨平台包
本章将要和大家分享的是Asp.NetCore1.1版本去掉了project.json后如何打包生成跨平台包, 为了更好跟进AspNetCore的发展,把之前用来做netcore开发的vs2015卸载后 ...
- 【荐】PHP Session和Cookie,Session阻塞,Session垃圾回收,Redis共享Session,不推荐Memcached保存Session
什么是 Session 在 web 应用开发中,Session 被称为会话.主要被用于保存某个访问者的数据. 由于 HTTP 无状态的特点,服务端是不会记住客户端的,对服务端来说,每一个请求都是全新的 ...
- Node.js中的Session,不要觉得简单哦。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,博客地址为http://www.cnblogs.com/jasonnode/ .学习网站上有对应 ...
- JAVA EE中session的理解
转自[互动百科]http://www.baike.com/wiki/Session Session Session:在计算机中,尤其是在网络应用中,称为“会话”.Session直接翻译成中文比较困 ...
- java session 详解
原网址:http://blog.sina.com.cn/s/blog_670b6d880101deff.html 一.术语session 在我的经验里,session这个词被滥用的程度大概仅次于tra ...
- [转]PHP5 session 详解
来源:http://blog.163.com/lgh_2002/blog/static/4401752620105246517509/ http协议是WEB服务器与客户 端(浏览器)相互通信的协议,它 ...
- Java基础-关于session的详细解释
转自:http://hi.baidu.com/zbzbzb/item/65d73d2a4d07cfd40f37f900 一.术语session 在我的经验里,session这个词被滥用的程度大概仅次于 ...
- Java——Cookie与Session
Cookie通过客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份. 1.Cookie 1.1概念及使用方法 Cookie实际上是一小段文本信息.客户端请求服务器,如果服务 ...
- Session机制详解
转自:http://justsee.iteye.com/blog/1570652 虽然session机制在web应用程序中被采用已经很长时间了,但是仍然有很多人不清楚session机制的本质,以至不能 ...
随机推荐
- hdu2068 RPG的错排
RPG的错排 时间限制:1000/1000 MS(Java / Others)内存限制:32768/32768 K(Java / Others)总提交内容:16421接受的提交内容:6670 问题描述 ...
- python 文件与异常
####文件### r: -只能读 不能写 -读取文件不存在,是会报错 r+: - 可以执行读写操作; - 文件不存在, 报错: w: -只能写,不能读 -会清空文件内容 -文件不存在,会新建文件 w ...
- 10.Web组件复用
1.静态包含(一个指令) 在软件工程中构建可复用组件可极大的提高软件生产效率.增强系统的可维护性HTML标记对于一个web应用系统中的页面都是通用的,比如公司标志.版权声明.导航菜单JSP中引用的we ...
- 10-----BBS论坛
BBS论坛(十) 10.1.客户端权限验证功能完成 (1)cms/cms_profile 显示当前用户的角色和权限 <tr> <td>角色:</td> <td ...
- SQL 优化通用方法
1. 尽量避免用sub-queres, 可以采用join代替 2. exists代替in not exists 和not in 这两个的性能值得深究,应该不是差太多 3. 索引优化 4. 一些操作会导 ...
- Flex布局教程
一.Flex布局是什么? Flex 是 Flexible Box 的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性.任何一个容器都可以指定为 Flex 布局. .box{ ...
- python_案例综合:教材记录管理
class Book(): def __init__(self,ISBN,Ftile,Author,Publisher): self.ISBN = ISBN self.Ftile = Ftile se ...
- windows下修改了系统变量里java_home所引用的jdk,但是查询jdk的版本并没有发生改变
# 原因:因为%SystemRoot%\system32 在引用这个环境变量时,会默认C:\Windows\System32下的jdk版本 # 解决方法: 把jdk的配置放在path前面就可以了
- inventor安装失败怎样卸载安装inventor 2014?
AUTODESK系列软件着实令人头疼,安装失败之后不能完全卸载!!!(比如maya,cad,3dsmax等).有时手动删除注册表重装之后还是会出现各种问题,每个版本的C++Runtime和.NET f ...
- 读<<programming ruby>> 7.6节 flip-flop 理解
书中源码是这样的 File.foreach('1.txt') do |x| if(($. == 1) || x =~ /eig/) .. (($. == 3) || x =~ /nin/) then ...