我们在前面的文章里面讲到session的原理和最佳实践,感到意犹未尽。现在再来聊下PHP Session用到的几个相关的函数。

session_start()

session_start() 会创建新会话或者重用现有会话。 如果通过 GET 或者 POST 方式,或者使用 cookie 提交了会话 ID, 则会重用现有会话。

当会话自动开始或者通过 session_start() 手动开始的时候, PHP 内部会调用会话管理器的 open 和 read 回调函数。 会话管理器可能是 PHP 默认的, 也可能是扩展提供的(SQLite 或者 Memcached 扩展), 也可能是通过 session_set_save_handler() 设定的用户自定义会话管理器。 通过 read 回调函数返回的现有会话数据(使用特殊的序列化格式存储), PHP 会自动反序列化数据并且填充 $_SESSION 超级全局变量。

要想使用命名会话,请在调用 session_start() 函数 之前调用 session_name() 函数。

如果启用了 session.use_trans_sid 选项, session_start() 函数会注册一个内部输出管理器, 该输出管理器完成 URL 重写的工作。

注意:要使用基于 cookie 的会话, 必须在输出开始之前调用 session_start() 函数。

session_unset()

销毁当前会话数据。或者$_SESSION = array(); 如果要销毁个别会话数据,可以unset ($_SESSION['varname']);.

session_destroy()

session_unset()销毁所有会话数据不同,session_destroy()销毁的是会话本身,此函数一出,当前session就变成垃圾了,等待gc机制去回收它。但是它并不会重置当前会话所关联的全局变量, 也不会重置会话 cookie。该有的会话数据还是在,只不过“身份”变了而已。如果gc尚且还没有去回收它,那么它仍然是可以读取到的,这当然是不愿意看到的,因此在session_destroy() 之前往往还要session_unset()一下。

如果需要再次使用会话变量, 必须重新调用 session_start() 函数。 为了彻底销毁会话,比如在用户退出登录的时候,必须同时重置会话 ID。 如果是通过 cookie 方式传送会话 ID 的,那么同时也需要 调用 setcookie() 函数来 删除客户端的会话 cookie。

下面例子是销毁数据本身:

// 初始化会话。
// 如果要使用会话,别忘了现在就调用:
session_start(); // 重置会话中的所有变量,销毁会话数据
$_SESSION = array(); // 或者session_unset() // 如果要清理的更彻底,那么同时删除会话 cookie
// 注意:这样不但销毁了会话中的数据,还同时销毁了会话本身
if (ini_get("session.use_cookies")) {
$params = session_get_cookie_params();
setcookie(session_name(), '', time() - 42000,
$params["path"], $params["domain"],
$params["secure"], $params["httponly"]
);
} // 最后,销毁会话
session_destroy();

销毁会话数据$_SESSION = array()session_unset() ;销毁会话本身session_destroy();和setcookie()session_destroy()执行后会话就变成垃圾会话,等待gc机制回收。

session_commit()

session_commit()session_write_close()别称。和session_start相反,这是关闭。即保存当前session数据,并且关闭当前会话。为了防止并发的写session,任何时刻只能允许有一个PHP脚本在操作session,因此,一个脚本一旦session_start打开session,那么在此脚本终止或者调用session_write_close()之前,别的任何脚本都不能使用session。在默认情况下脚本结束时会自动写入和关闭session,但是在脚本执行时间比较长的时候,此脚本就一致占据锁使得别的脚本无法使用session,因此导致许多错误。因此,最佳实践是,任何session变量,数据的更改(如$_SESSION[xx] = xxx),都要及时使用session_commit()保存数据,关闭会话。

session_id ()

session_id() 可以用来获取/设置 当前会话 ID。 为了能够将会话 ID 很方便的附加到 URL 之后, 你可以使用常量 SID 获取以字符串格式表达的会话名称和 ID。简单说,就是如果你开启的是POST/GET方式获取会话ID,那么这个参数可以通过session.use_trans_sid设定并在URL中看得见,而在脚本中通过全局变量SID来直接获取。

//配置
ini_set('session.use_trans_sid', 'sid');
//url中表现
127.0.0.1?sid=xxxxx
//直接获取
$sid = SID;

如果指定了 session_id () 参数的值, 则使用指定值作为会话 ID。 必须在调用 session_start() 函数之前调用 session_id() 函数。不同的会话管理器对于会话 ID 中可以使用的字符有不同的限制。 如果当前没有会话,则返回空字符串("")。

这里有两点值得注意下:

  • 如果使用 cookie 方式传送会话 ID,并且指定了 id 参数, 在调用 session_start() 之后都会向客户端发送新的 cookie, 无论当前的会话 ID 和新指定的会话 ID 是否相同
  • 在通过session_id ($id )切换当前会话ID之前,需要通过session_commit()来关闭上一个会话,否则当前会话还是原来的

更多的函数可以参看PHP官网或者手册。

PHP Session 常用的函数的更多相关文章

  1. EL表达式 JSTL中的常用EL函数 动态数据的国际化

    ELppt: EL 全名为Expression Language.EL主要作用: 获取数据: •EL表达式主要用于替换JSP页面中的脚本表达式,以从各种类型的web域 中检索java对象.获取数据.( ...

  2. PLSQL常用时间函数

    body { font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI ...

  3. Oracle笔记之——常用的函数及脚本

    一.oracle 常用的函数及关键字 1.集合操作 1)minus 差集 2)intersect 交集 3)UNION 并集,会去重 4)UNION ALL 并集,不去重2.事物 1)COMMIT ( ...

  4. oracle(sql)基础篇系列(一)——基础select语句、常用sql函数、组函数、分组函数

        花点时间整理下sql基础,温故而知新.文章的demo来自oracle自带的dept,emp,salgrade三张表.解锁scott用户,使用scott用户登录就可以看到自带的表. #使用ora ...

  5. php常用字符串函数小结

    php内置了98个字符串函数(除了基于正则表达式的函数,正则表达式在此不在讨论范围),能够处理字符串中能遇到的每一个方面内容,本文对常用字符串函数进行简单的小结,主要包含以下8部分:1.确定字符串长度 ...

  6. php常用数组函数回顾一

    数组对于程序开发来说是一个必不可少的工具,我根据网上的常用数组函数,结合个人的使用情况,进行数组系列的总结复习.里面当然不只是数组的基本用法,还有相似函数的不同用法的简单实例,力求用最简单的实例,记住 ...

  7. byte数据的常用操作函数[转发]

    /// <summary> /// 本类提供了对byte数据的常用操作函数 /// </summary> public class ByteUtil { ','A','B',' ...

  8. WordPress主题模板层次和常用模板函数

    首页: home.php index.php 文章页: single-{post_type}.php – 如果文章类型是videos(即视频),WordPress就会去查找single-videos. ...

  9. Python 常用string函数

    Python 常用string函数 字符串中字符大小写的变换 1. str.lower()   //小写>>> 'SkatE'.lower()'skate' 2. str.upper ...

随机推荐

  1. Conditional Random Fields (CRF) 初理解

    1,Conditional Random Fields

  2. 初试 Windows XP Embedded 系统开发1

    目前 Windows PE(Preinstallation Environment)和 Windows XP Embedded 是可以脱离主机里的硬盘独立运行的 Windows 操作系统,Window ...

  3. JDBC连接池-自定义连接池

    JDBC连接池 java JDBC连接中用到Connection   在每次对数据进行增删查改 都要 开启  .关闭  ,在实例开发项目中 ,浪费了很大的资源 ,以下是之前连接JDBC的案例 pack ...

  4. 芝麻HTTP:非关系型数据库存储

    NoSQL,全称Not Only SQL,意为不仅仅是SQL,泛指非关系型数据库.NoSQL是基于键值对的,而且不需要经过SQL层的解析,数据之间没有耦合性,性能非常高. 非关系型数据库又可细分如下. ...

  5. JavaScript小括号、中括号、大括号的多义性

    语义1,函数声明时参数表 func(arg1,arg2){ // ... } 语义2,和一些语句联合使用以达到某些限定作用 // 和for in一起使用 for(var a in obj){ // . ...

  6. WPF中使用WebBrowser

    最近在做北京现代项目的时候,遇到一个需求将韩国那边写好的网页嵌套到WPF程序中显示. 开始的时候使用的是第三方的浏览器控件:awesomium,在本地测试,显示没有问题.但是拿到客户现场,只显示半屏. ...

  7. SOA和微服务架构

    微服务架构强调的第一个重点就是业务系统需要彻底的组件化和服务化,原有的单个业务系统会拆分为多个可以独立开发,设计,运行和运维的小应用.这些小应用之间通过服务完成交互和集成.每个小应用从前端web ui ...

  8. 基于Global.asax实现显示当前在线人数--ASP.NET基础

    相对来说比较简单,直接贴代码了哈: Global.asax: <%@ Application Language="C#" %><script runat=&quo ...

  9. Python基础__Python语法基础、条件、循环

    之前主要讨论的是Python的对象,这本节将第一次走进Python的语言之旅,将会介绍条件与循环.本节我们将会涉及到复合语句,简要介绍一下Python的语法规则是有必要的Python语法规则 1.语句 ...

  10. [BZOJ1878] [SDOI2009] HH的项链 (树状数组)

    Description HH有一串由各种漂亮的贝壳组成的项链.HH相信不同的贝壳会带来好运,所以每次散步 完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH不断地收集新的贝壳,因此, 他的项链变 ...