Home > php教程 > php手册 > 浅谈PHP中的session函数

浅谈PHP中的session函数

PHPz
Release: 2018-10-23 17:16:25
forward
1057 people have browsed it

session是一种,将K存放于这个过程中间(浏览器到服务器的数据传递过程),V存放于服务端(默认是文件,也可以使MYSQL,MC,REDIS等自己写的服务),这里面会包含两部分:

1. 传递过程

2. 服务端数据存储

传递过程,默认是通过cookie,K的存储在浏览器内,有时也可以通过query get的方式,那么这时,它存储在哪里?有可能是页面,有可能是服务器返回的链接,最终的展现是浏览器的页面上。所以,说:session存储在浏览器或者服务器端的,答案都不完整。
数据存储,默认是文件,一般在文件目录:/tmp 下,但是你也可以设置为mysql等其它的服务存储。那么有了这些,服务器端的压力可以很好的摊分,为什么?我可以对数据做哈希散列,可以内存存储(共享内存),这些消耗的代价都小于文件。当然也是在一定程度上的。

session存储

首先,我们为什么需要Session,就是因为我们需要存储各个用户的状态数据。那么试问,如果由你来设计解决这个需求的方案,那么也许你会设置这样一个数据表用与存储各个用户的状态信息:

uid               created      data                      max_age

94c55770fdf044a7  1270802787  jtUsername=admin           14400

2c37df64277e4409  1270822787  jtUsername=Joe;jtBooks=8;  14400

…  …  …  …

uid : 用户唯一标识符,区分其它用户 

created : 记录产生时间

data : 存放与用户相关的数据 

max_age : 记录的有效时间

同样地,PHP设计管理session方案也大致如此,它分别包含了以下信息:

1. session id

用户session唯一标识符,随机生成的一串字符串,具有唯一性,随机性。主要用于区分其它用户的session数据。用户第一次访问web页面的时候,php的session初始化函数调用会分配给当前来访用户一个唯一的ID,也称之为session_id。

2. session data

我们把需要通过session保存的用户状态信息,称为用户session数据,也称为session数据。

3. session file

PHP默认将session数据存放在一个文件里。我们把存放session数据的文件称为session文件。它由特殊的php.ini设置session.save_path指定session文件的存放路径,CentOS5.3操作系统,PHP5.1默认存放在/var/lib/php/session目录中。用户session文件的名称,就是以sess_为前缀,以session_id为结尾命名,比如session id为vp8lfqnskjvsiilcp1c4l484d3,那么session文件名就是sess_vp8lfqnskjvsiilcp1c4l484d3

4. session lifetime

我们把初始化session开始,直到注销session这段期间,称为session生命周期,这样有助于我们理解session管理函数。

由此,我们可见: 当每个用户访问web, PHP的session初始化函数都会给当前来访用户分配一个唯一的session ID。并且在session生命周期结束的时候,将用户在此周期产生的session数据持久到session文件中。用户再次访问的时候,session初始化函数,又会从session文件中读取session数据,开始新的session生命周期。

与session存储相关php.ini设置

1. session.save_handler = file

用于读取/回写session数据的方式,默认是files。它会让PHP的session管理函数使用指定的文本文件存储session数据

2. session.save_path =“/var/lib/php/session”

指定保存session文件的目录,可以指定到别的目录,但是指定目录必须要有httpd守护进程属主(比如apache或www等)写权限,否则无法回存session数据。当指定目录不存在时,php session环境初始化函数是不会帮你创建指定目录的,所以需要你手工建立指定目录。

它还可以写成这样session.save_path =“N;/path” 其中N是整数。这样使得不是所有的session文件都保存在同一个目录中,而是分散在不同目录。这对于服务器处理大量session文件是很有帮助的。(注:目录需要自己手工创建)

3. session.auto_start = 0

如果启用该选项,用户的每次请求都会初始化session。我们推荐不启用该设置,最好通过session_start()显示地初始化session。

Session同步数据

一旦调用了session_start()初始化session,就意味着开始了一个session生命周期。也就是宣布了,可以使用相关函数操作$_SESSION来管理session数据。这个session生命周期产生的数据并没有实时地写入session文件,而是通过$_SESSION变量寄存在内存中。那么,寄存在内存的数据什么时候会写入到session文件?这也是我们这一小节的主要测试内容。

在进行测试之前,先让我们介绍几个影响session数据的PHP函数、或事件

1. session_start()

函数session_start会初始化session,也标识着session生命周期的开始。要使用session,必须初始化一个session环境。有点类似于OOP概念中调用构造函数构创建对象实例一样。

session初始化操作,声明一个全局数组$_SESSION,映射寄存在内存的session数据。如果session文件已经存在,并且保存有session数据,session_start()则会读取session数据,填入$_SESSION中,开始一个新的session生命周期,如果session文件不存在那么创建一个session文件并生成sessionid包含在响应头信息中传回客户端。

2. $_SESSION

它是一个全局变量,类型是Array,映射了session生命周期的session数据,寄存在内存中。在session初始化的时候,从session文件中读取数据,填入该变量中。在session生命周期结束时,将$_SESSION数据写回session文件。

3. session_register()

在session生命周期内,使用全局变量名称将注全局变量注册到当前session中。所谓注册,就是将变量填入$_SESSION中,值为NULL。它不会对session文件进行任何IO操作,只是影响$_SESSION变量。注意,它的正确写法是session_register(‘varname’),而不是session_register($varname) 

4. session_unregister()

与session_register操作正好相反,即在session生命周期,从当前session注销指定变量。同样只影响$_SESSION,并不进行任何IO操作。

5. session_unset()

在session生命周期,从当前session中注销全部session数据,让$_SESSION成为一个空数组。它与unset($_SESSION)的区别在于:unset直接删除$_SESSION变量,释放内存资源;另一个区别在于,session_unset()仅在session生命周期能够操作$_SESSION数组,而unset()则在整个页面(page)生命周期都能操作$_SESSION数组。session_unset()同样不进行任何IO操作,只影响$_SESSION数组。

6. session_destroy()

如果说session_start()初始化一个session的话,而它则注销一个session。意味着session生命周期结束了。在session生命周期结整后,session_register, session_unset, session_register都将不能操作$_SESSION数组,而$_SESSION数组依然可以被unset()等函数操作。这时,session意味着是未定义的,而$_SESSION依然是一个全局变量,他们脱离了关映射关系。

通过session_destroy()注销session,除了结束session生命周期外,它还会删除sesion文件,但不会影响当前$_SESSION变量。即它会产生一个IO操作。

7. session_regenerate_id()

调用它,会给当前用户重新分配一个新的session id。并且在结束当前页面生命周期的时候,将当前session数据写入session文件。前提是,调用此函数之前,当前session生命周期没有被终止(参考第9点)。它会产生一个IO操作,创建一个新的session文件,创建新的session文件的是在session结束之前,而不是调用此函数就立即创建新的session文件。

8. session_commit()

session_commit()函数是session_write_close()函数的别名。它会结束当前session的生命周期,并且将session数据立即强制写入session文件。不推荐通过session_commit()来手工写入session数据,因为PHP会在页面生命周期结束的时候,自动结束当前没有终止的session生命周期。它会产生一个IO写操作

9.session_cache_expire ()

返回当前的缓存期限。如果传递了参数,则返回参数值,否则返回默认的session.cache_expire值。

只有在session.cache_limiter设置的值不是 nocache的时候,参数设置才有效。

10.session_cache_limiter()

返回缓存方式,有nocache,private,private_no_expire,public这几种。

他决定你浏览网页的缓存方式,没有缓存会使浏览器的“后退”键需要更新连接,那么之前的内容就没有了,比如填入的表单信息,都会丢失

session的处理机制里可以用session_cache_limiter来强制的调用header函数来设置cache,这几个参数的意义分别为:

nocache:不允许客户端/代理缓存,比如表单内容被清除,但公共变量可以缓存

private:只允许在客户端缓存,在生存期(由session_cache_expire指定)内有效

private_no_expires:私有方式缓存,如果一个过期的http头部发送到客户端可能会造成混乱,可以采用这种方法来解决。

public:可以代理方式和客户端缓存

11. end session

结束session,默认是在页面生命周期结束的之前,PHP会自动结束当前没有终止的session。但是还可以通过session_commit()与session_destroy()二个函数提前结束session。不管是哪种方式,结束session都会产生IO操作,分别不一样。默认情况,产生一个IO写操作,将当前session数据写回session文件。session_commit()则是调用该函数那刻,产生一个IO写操作,将session数据写回session文件。而session_destroy()不一样在于,它不会将数据写回session文件,而是直接删除当前session文件。有趣的是,不管是session_commit(),还是session_destroy()都不会清空$_SESSION数组,更不会删除$_SESSION数组,只是所有session_*函数不能再操作session数据,因为当前的session生命周期终止了,即不能操作一个未定义对象。

更多相关教程请访问  php编程从入门到精通全套视频教程

Related labels:
source:csdn.net
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Recommendations
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template