PHP中Session_start()函数的使用与Session ID的创建及保存详解
Session 的设置与 Cookie 不同,需要先启动。在 PHP 中,必须调用 session_start()函数。该函数的语法格式如下:

创建 Session 并开始一个会话,进行 Session 初始化,即调用 Bool session_start(void) 函数。
登录后复制
注意:session_start()函数之前不能有任何输出
第一次访问网站时,Seesion_start()函数会创建一个唯一的 Session ID。它会自动通过 HTTP 的响应头,把这个 Session ID 保存到客户端的 Cookie 中。与此同时,在服务器端也会创建一个以该 Session ID 命名的文件,用来保存这个用户的会话信息。
当同一个用户再次访问该网站时,会自动通过 HTTP 的请求头把 Cookie 中保存的 Session ID 携带过来。此时,Session_start()函数不会再分配一个新的 Session ID,而是在服务器的硬盘中寻找与这个 Session ID 同名的 Session 文件,将之前为这个用户保存的会话信息读出,在当前脚本中应用,以达到跟踪这个用户的目的。 Session以数组的形式使用,如:
$_SESSION['session名']
登录后复制
有关于 php session 的相关专题推荐,其中包含图文内容,还有视频以及案例。
注册一个会话变量和读取Session
在 PHP 里使用 Session 变量,首先得启动它,其次还得经过注册这一过程。注册 Session 变量以及读取 Session 变量,都需要通过访问 $_SESSION 数组来实现。在 $_SESSION 关联数组中,其键名遵循和 PHP 中普通变量一样的命名规则。注册 Session 变量的代码如下:
代码如下
//启动session的初始化 session_start(); //注册session变量,赋值为一个用户的名称 "username" 在 $_SESSION 中被设置成 "skygao"。 //注册session变量,赋值为一个用户的ID $_SESSION["uid"]=1; ?>
登录后复制
执行该脚本后,两个 Session 变量会被保存在服务器端的某个文件里。这个文件的位置是通过 php.ini 文件里的 session.save_path 属性来指定目录的。
注销变量与销毁Session
使用完一个 Session 变量后可将其删除。完成一个会话后也可将其销毁。若用户退出 Web 系统,需为其提供注销功能,把他的所有信息在服务器中销毁。调用 session_destroy()函数可销毁和当前 Session 有关的所有资料,结束当前会话并清空会话中的所有资源。该函数的语法格式如下所示:
函数 session_destroy(void) 用于销毁与当前 Session 相关的所有资料。
登录后复制
该函数不会删除保存在客户端 Cookie 中的 Session。
ID。由于$_SESSION 数组与自定义数组在使用方面是一样的,所以我们能够运用 unset()函数去释放注册在 Session 中的单个变量。具体如下:
unset($_SESSION['键名']);
登录后复制
要特别留意,不能使用 unset($_SESSION) 来删除整个 $_SESSION 数组,因为这样做之后就无法再通过 $_SESSION 超全局数组来注册变量了。然而,如果想要把某个用户在 Session 中注册的所有变量都删除,那么可以直接将数组变量 $_SESSION 赋予一个空数组。具体如下:
$_SESSION=array()
登录后复制
PHP 默认的 Session 是以 Cookie 为基础的。Session 通常在用户访问网站时被创建和使用,它用于在不同的页面请求之间存储和跟踪用户的信息。Cookie 是一种在用户浏览器中存储少量数据的机制,PHP 利用 Cookie 来实现 Session 的功能。当用户访问带有 Session 相关代码的页面时,PHP 会检查是否存在有效的 Session ID,如果存在,则根据该 ID 从服务器端的 Session 存储中获取用户的信息;如果不存在,则会创建一个新的 Session 并分配一个唯一的 Session ID,同时将该 ID 作为 Cookie 发送给用户的浏览器,以便在后续的请求中能够识别和使用该 Session。
ID被存储在客户端的 Cookie 中,因此在注销 Session 时,需要清除 Cookie 中保存的 SessionID,这必须借助 setCookie()函数来完成。在 PHP 脚本中,能够通过调用 session_name()函数获取 Session 名称,然后删除保存在客户端 Cookie 中的 Session。
ID,代码如下所示:
//判断Cookie中是否存在session ID 如果设置了($_COOKIE[session_name()]),那么就会有相应的情况。 删除包含 Session ID 的 cookie,要确保第四个参数与 php.ini 设置的路径保持一致。 设置名为 session_name() 的 cookie,其值为空字符串,过期时间为当前时间减去 3600 秒,作用域为根目录 / 。 } ?>
登录后复制
前面的介绍表明,Session 的注销过程包含 4 个步骤。在下面的例子里,给出了完整的四个步骤的代码,运行这个脚本就能关闭 Session 并且销毁与本次会话相关的所有资源。代码如下:
代码如下
//第一步:开启Session并初始化
session_start();
第二部:将所有 Session 的变量进行删除,能够通过 unset($_SESSION[XXX])这种方式逐个地进行删除。
$_SESSION = array();
如果采用基于 Cookie 的 session,那么就使用 setCookie()来删除包含 Session ID 的 cookie。
如果存在 $_COOKIE[session_name()] ,那么 { }
设置名为 session_name() 的 Cookie,其值为空字符串,过期时间为当前时间减去 42000 秒,作用域为根路径 / 。
}
//第四部:最后彻底销毁session
session_destroy();
?>
登录后复制
session的phpini配置选项
session.auto_start 等于 1 时,就无需在每次使用 session 之前都调用 session_start(),此做法不建议使用。然而,启用该选项存在一些限制,若确实启用了 session.auto_start,就不能将对象放入会话中,因为类定义必须在启动会话之前加载,以便在会话中重建对象。
Session的垃圾自动回收机制
在页面中可通过 session_destroy()函数设置一个“退出”按钮,通过点击该按钮可销毁本次会话。然而,倘若用户未点击退出按钮,而是直接将浏览器关闭,或者出现断网等情况,那么在服务器端保存的 Session 文件将不会被删除。关闭浏览器后,下次登录需要重新分配一个新的 Session ID 并重新登录。这是因为在 php.ini 中的设置 session.cookie_lifetime=0,该设置用于设定 Session ID 在客户端 Cookie 中的有效限期,是以秒为单位来指定发送到浏览器的 Cookie 的生命周期。
系统赋予 Session 有效期限后,不论浏览器是否开启,Session ID 都会自动消失。同时,客户端的 Session ID 消失了,但服务器端保存的 Session 文件并未被删除。因此,那些未被 Session ID 引用的服务器端 Session 文件,就变成了“垃圾”。
服务器保存的 Session 文件属于普通文本文件,因此它都会有文件修改时间。
“垃圾回收程序”启动后,会依据 Session 文件的修改时间,把所有过期的 Session 文件全部删除。可以通过在 php.ini 中设置 session.gc_maxlifetime 选项来指定一个时间,这个时间的单位是秒,比如设置该选项值为 1440 ,也就是 24 分钟。垃圾回收程序会对所有的 Session 文件进行排查。如果某个 Session 文件的修改时间距离当前系统时间超过了 1440 秒,那么就会将其删除。
“session垃圾回收程序”是怎样的启动机制呢?
“垃圾回收程序”在调用 session_start()函数时开始启动。一个网站存在多个脚本,若没有脚本却都需使用 session_start()函数来开启会话,且有很多用户同时进行访问,那么很有可能在 1 秒内 session_start()函数会被调用 N 次。倘若每次都会启动“session 垃圾回收程序”,这种情况是很不合理的。可以通过修改 php.ini 文件中的“session.gc_probability”和“session.gc_divisor”这两个选项,来设置启动垃圾回收程序的概率。会依据“session.gc_probability/session.gc_divisor”这个公式来计算概率。比如有选项 session.gc_probability 等于 1,同时选项 session.gc_divisor 等于 100,那么这种情况下的概率就是“1/100”,也就是说 session_start()函数需要被调用 100 次才有可能启动“垃圾回收程序”。
php.ini中相关的配置
cookie禁用时通过URL传递session的ID
使用 Session 来跟踪一个用户,这是通过在各个页面之间传递唯一的 Session ID 来实现的,并且可以通过这个 Session ID 提取出该用户在服务器中保存的 Session 变量。常见的 Session ID 传送方式有以下两种。
第一种方法是通过 cookie 来传递 session ID。这种方式较为优越,然而它并非总是能够被使用,原因在于用户在客户端有能力屏蔽 cookie。
第二种方法是利用 url 参数来进行传递。它可以直接把 session ID 整合到 URL 里面。
在 Session 的实现过程中,通常会采用 Cookie 的方式。客户端所保存的 Session ID 就是一个 Cookie。如果客户禁用了 Cookie,那么 Session ID 就无法在 Cookie 中进行保存,也就不能在不同的页面之间进行传递,在这种情况下,Session 就会失效。PHP5 在 Linux 平台能够自动对 Cookie 状态进行检查。倘若客户端将其禁用,那么系统就会自动把 Session ID 附加到 URL 上进行传送。而当使用 Windows 系统作为 Web 服务器时,就不具备这样的功能。
PHP 提出了另一种跟踪 Session 的机制。若客户浏览器不支持 Cookie,那么 PHP 能够重写客户请求的 URL,将 Session ID 添加至 URL 信息里。可以在每个超链接的 URL 中手动加上一个 Session ID,不过这样的工作量较大,不建议采用这种方法。如下所示:
代码如下
//开启session session_start(); 在每个 URL 之后加上参数,这个参数的变量名是通过 session_name()来获取的,其值是通过 session_id()来获取的。 echo '连接演示'; ?>
登录后复制
使用 Linux 系统做服务器时,编辑 PHP 若使用了–enable-trans-sid 配置选项,且运行时选项 session.use_trans_sid 被激活,当客户端禁用 Cookie 时,相对 URL 会被自动修改为包含会话 ID。如果没有进行这样的配置,或者在使用 Windows 系统作为服务器的情况下,能够使用常量 SID。这个常量是在会话启动的时候被定义的。倘若客户端没有发送合适的会话 Cookie,那么 SID 的格式就是 session_name=session_id;要是客户端发送了合适的会话 Cookie,那么 SID 就是一个空字符串。所以可以毫无条件地把它嵌入到 URL 中。在下面的例子里使用了两个脚本程序,展示了 Session ID 的传送方式。
session_start(); 设置会话变量 $_SESSION 中的 "username" 为 "admin"。 输出“会话 ID:”加上当前会话的 ID。 "; ?>
登录后复制
通过URL传递Session ID
在脚本 test2.php 里,输出 test1.php 脚本在 Session 变量中所保存的另一个用户名。接着在该页面再次输出 Session ID,通过对比来判断两个脚本是否使用同一个 Session ID。并且,在开启或者关闭 Cookie 的时候,要留意浏览器地址栏中 URL 的变化。代码如下所示:
代码如下
session_start(); 输出 $_SESSION["username"] 并在其后添加空字符串 "" 。 echo "session ID:".session_id()." "; ?>
登录后复制
相关学习推荐:PHP编程从入门到精通