原文地址:http://blog.163.com/lgh_2002/blog/static/4401752620105246517509/
http协议是WEB服务器与客户端(浏览器)相互通信的协议,它是一种无状态协议。所谓无状态,指的是不会维护http请求数据,http请求是独立的,非持久的。而越来越复杂的WEB应用,需要保存一些用户状态信息。这时候,Session这种方案应需而生。PHP从4.1开始支持Session管理。
session是很抽象的一个概念。我们不妨先从与它几个息息相关的有迹可寻的小切入点入手,然后逐渐地认识了解它。
-
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生命周期。
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. 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生命周期终止了,即不能操作一个未定义对象。
相关推荐
- "Session1"至"Session6":可能是分步骤的教程,逐步解释如何在PHP中使用会话,从基础概念到高级应用。 - "PHP Session":可能是一个综合性的PHP会话管理教程或示例代码。 通过深入学习这些资源,开发者不仅可以...
**PHP的Session基础** 在Web开发中,PHP的Session机制是一种非常重要的用户状态管理工具,它允许开发者在用户的浏览器会话之间存储数据,确保在不同页面间传递信息。本篇文章将深入探讨Session的工作原理以及其在...
让我们深入探讨一下"Laravel开发-session-auth"的主题。 **1. Session** Session在Web开发中用于在多个HTTP请求之间存储用户的状态信息。在Laravel中,它提供了一个简单易用的接口来管理和使用session数据。...
根据提供的文件信息,我们可以从标题、描述以及部分给出的内容中提炼出有关PHP基础知识学习的关键信息。下面将对这些信息进行详细的展开与解释。 ### 标题解析:“后盾网教学视频 PHP基础--向军 (143课时 6.8G)”...
接下来,在`config/session.php`配置文件中,将`driver`设置为`cookieless`。最后,将中间件添加到全局中间件堆栈或者特定路由/控制器上。 ### 4. 使用与注意事项 - **安全**:使用URL参数传递会话ID可能导致URL被...
if ($session->has('key')) { // ... } // 移除Session数据 $session->forget('key'); // 清空所有Session数据 $session->flush(); ``` ### 4. 自定义Session驱动 如果需要实现自定义的Session驱动,可以在`...
在PHP编程中,跨域(Cross-Origin)和伪造SESSION(Session Hijacking)是两个重要的安全概念,它们都与Web应用程序的安全性密切相关。本篇文章将详细解释这两个概念,并提供相关的解决方案和预防措施。 首先,让...
Session依赖于Cookie来传递Session ID,这是Session正常工作的基础。 **3.1 Cookie的作用** Cookie是一种小型文本文件,用于存储客户端的信息。在Session中,最重要的作用就是存储Session ID。 **3.2 如何处理...
1. **Session 基础**: - Session是一种在服务器端存储用户数据的方法,不同于Cookie存储在客户端。 - PHP中的`session_start()`函数用于开启一个会话,允许访问和设置Session变量。 - 通过`$_SESSION`全局数组,...
本教程“零基础学习PHP-从零开始学习PHP-PHP基础教程”旨在帮助初学者掌握PHP的基本概念和核心技能,让你能够快速入门并逐渐深入到PHP的世界。 1. PHP简介: PHP最初由Rasmus Lerdorf于1995年创建,旨在处理表单...
在PHP编程中,Session是一种非常重要的机制,用于在用户的不同页面请求之间存储和检索数据。一个良好的Session操作类可以极大地提升代码的可...使用这样的类,开发者可以更专注于业务逻辑,而不是基础的Session操作。
总之,PHP session购物车是一个基础但关键的应用,它展示了如何在无状态的HTTP环境中维持用户状态。理解并熟练掌握这一技术对于任何PHP开发者来说都是至关重要的,无论是在学习阶段还是在实际工作中。
1. PHP Session基础 PHP Session允许开发者在多个页面之间存储和检索用户的会话数据。在PHP中,session_start()函数用于开启一个新的会话或恢复已存在的会话。每个会话都有一个唯一的会话ID(session_id),存储在...
### PHP基础教程知识点详解 #### 一、PHP简介与开发环境搭建 **1.1 Web程序工作原理** Web程序的工作原理主要包括客户端与服务器端之间的交互。客户端通过浏览器发送请求到服务器,服务器根据请求处理相应的逻辑...
### PHP5 Session 详解 #### 一、HTTP 协议与 Session 的必要性 HTTP(HyperText Transfer Protocol)协议作为 Web 服务器与客户端之间通信的基础协议,其本质特征之一是无状态性。这意味着每次 HTTP 请求都是独立...
此外,还要掌握会话管理(session)、cookie的使用,以及表单数据的验证和过滤,这些都是构建Web应用的基础。对于错误和异常处理,理解try-catch机制,以及如何使用error_reporting()和set_error_handler()来定制...
在PHP编程中,有几个核心...以上五个类是PHP开发中的基础工具,它们简化了常见的Web开发任务,提高了代码的可维护性和复用性。在实际项目中,开发者可以依据具体需求对这些类进行扩展和定制,以适应不同的业务逻辑。