Session是什么,PHP Session的创建和使用(非常详细)
HTTP 是无状态协议,也就是说 HTTP 的工作过程是请求与回应的简单过程,所以 HTTP 没有一个内置的方法来存储这个过程中各方的状态。
比如,当同一个用户向服务器发出两个不同的请求时,虽然服务器端都会给以相应的回应,但是它并没有办法知道这两个动作是由同一个用户发出的。
由此,会话(Session)管理应运而生。通过使用一个会话,程序可以跟踪用户的身份和行为,并且根据这些状态数据给用户以相应的回应。
SessionID 就像一把钥匙,用来注册到 Session 变量中,而这些 Session 变量存储在服务器端。SessionID 是客户端唯一存在的会话数据。
使用 SessionID 打开服务器端相对应的 Session 变量,跟用户相关的会话数据便一目了然。默认情况下,服务器端的 Session 变量数据以文件的形式加以存储,但是会话变量数据也经常通过数据库进行保存。
使用 Session 可以不需要手动设置 Cookie,PHP Session 可以自动处理。可以使用会话管理及 PHP 中的 session_get_cookie_params() 函数来访问 Cookie 的内容。这个函数将返回一个数组,包括 Cookie 的生存周期、路径、域名、secure 等。它的格式为:
不过通过 URL 传递 SessionID 会产生一些安全问题。如果这个连接被其他用户复制并使用,有可能造成用户判断错误。其他用户可能使用 SessionID 访问目标用户的数据。
或者也可以通过程序把 SessionID 存储到常量 SID 中,然后通过一个连接进行传递。
但是使用这种方法的同时,不能把 Session 变量对象化。应定义此对象的类,必须在创建会话之前加载,然后新创建的会话才能加载此对象。
session_start() 函数的语法格式如下:
例如,启动会话,创建一个 Session 变量并赋予 xiaoli 的值,代码如下:
在访问 $_SESSION 数组时,先要使用 isset() 或 empty() 来确定 $_SESSION 中会话变量是否为空。如下面的代码所示:
下面通过实例讲解存储和取回 $_SESSION 变量的方法。

图 1 程序运行效果
unset() 函数用于释放指定的 Session 变量,代码如下:
1) 在网站根目录下建立一个文件夹,名为 session。
2) 在 session 文件夹下建立 opensession.php,输入以下代码并保存:
3) 在 session 文件夹下建立 usesession.php,输入以下代码并保存:
4) 在 session 文件夹下建立 closesession.php,输入以下代码并保存:
5) 运行 opensession.php 文件,结果如下图所示:

图 2 程序运行结果
6) 单击页面中的“下一页”链接,运行结果如下图所示:

图 3 程序运行结果
7) 单击页面中的“下一页”链接,运行结果如下图所示:

图 4 程序运行结果
比如,当同一个用户向服务器发出两个不同的请求时,虽然服务器端都会给以相应的回应,但是它并没有办法知道这两个动作是由同一个用户发出的。
由此,会话(Session)管理应运而生。通过使用一个会话,程序可以跟踪用户的身份和行为,并且根据这些状态数据给用户以相应的回应。
Session的基本功能
在 PHP 中,每一个 Session 都有一个 ID。这个 SessionID 是一个由 PHP 随机生成的加密数字。这个 SessionID 通过 Cookie 存储在客户端浏览器中,或者直接通过 URL 传递到客户端,如果在某个 URL 后面看到一长串加密的数字,则这很有可能就是 SessionID 了。SessionID 就像一把钥匙,用来注册到 Session 变量中,而这些 Session 变量存储在服务器端。SessionID 是客户端唯一存在的会话数据。
使用 SessionID 打开服务器端相对应的 Session 变量,跟用户相关的会话数据便一目了然。默认情况下,服务器端的 Session 变量数据以文件的形式加以存储,但是会话变量数据也经常通过数据库进行保存。
Cookie与Session
在浏览器中,有些用户出于安全性的考虑,关闭了其浏览器的 Cookie 功能。这种情况下 Cookie 将不能正常工作。使用 Session 可以不需要手动设置 Cookie,PHP Session 可以自动处理。可以使用会话管理及 PHP 中的 session_get_cookie_params() 函数来访问 Cookie 的内容。这个函数将返回一个数组,包括 Cookie 的生存周期、路径、域名、secure 等。它的格式为:
session_get_cookie_params(生存周期、路径、域名、secure)
在Cookie或URL中存储SessionID
PHP 默认情况下会使用 Cookie 来存储 SessionID。但是如果客户端浏览器不能正常工作,就需要用 URL 方式传递 SessionID。如果将 php.ini 中的 session.use_trans_sid 设置为启用的状态,就可以自动通过 URL 来传递 SessionID。不过通过 URL 传递 SessionID 会产生一些安全问题。如果这个连接被其他用户复制并使用,有可能造成用户判断错误。其他用户可能使用 SessionID 访问目标用户的数据。
或者也可以通过程序把 SessionID 存储到常量 SID 中,然后通过一个连接进行传递。
PHP Session基本操作
一个完整的会话包括创建会话、注册会话变量、使用会话变量和删除会话变量。下面介绍有关会话管理的基本操作。1、创建Session
常见的创建会话方法有 3 种,包括 PHP自动创建、使用 session_start() 函数创建和使用 session_register() 函数创建。1) PHP自动创建
用户可以在 php.ini 中设定 session.auto_start 为启用。但是使用这种方法的同时,不能把 Session 变量对象化。应定义此对象的类,必须在创建会话之前加载,然后新创建的会话才能加载此对象。
2) 使用session_start()函数
这个函数首先检查当前是否已经存在一个会话,如果不存在,它将创建一个全新的会话,并且这个会话可以访问超全局变量 $_SESSION 数组。如果已经有一个存在的会话,则函数会直接使用这个会话加载已经注册过的会话变量,然后使用。session_start() 函数的语法格式如下:
bool session_start(void);
例如:提示,session_start() 函数必须位于 <html> 标签之前。
<?php session_start(); ?> <html> <body> </body> </html>上面的代码会向服务器注册用户的会话,以便可以开始保存用户信息,同时会为用户会话分配一个 UID。
3) 使用session_register()函数
在使用 session_register() 函数之前,需要在 php.ini 文件中将 register_globals 设置为 on,然后需要重启服务器。session_register() 函数通过为会话登录一个变量来隐含地启动会话。2、注册Session变量
会话变量被启动后,全部保存在数组 $_SESSION 中。用户可以通过对 $_SESSION 数组赋值来注册会话变量。例如,启动会话,创建一个 Session 变量并赋予 xiaoli 的值,代码如下:
<?php session_start(); //启动Session $_SESSION['name']='xiaoli'; //声明一个名为name的变量,并赋值xiaoli ?>这个会话变量值会在此会话结束或被注销后失效,或者还会根据 php.ini 中的 session.gc_maxlifetime(当前系统设置的 1440 秒,也就是 24 小时)设置会话最大生命周期数,过期则失效。
3、使用Session变量
使用会话变量,首先要判断会话变量是否存在一个会话 ID:- 如果不存在,就需要创建一个,并且能够通过 $_SESSION 变量进行访问;
- 如果已经存在,就将这个已经注册的会话变量载入以供用户使用。
在访问 $_SESSION 数组时,先要使用 isset() 或 empty() 来确定 $_SESSION 中会话变量是否为空。如下面的代码所示:
<?php if(!empty($_SESSION['session_name'])) //判断会话变量是否为空 $ssvalue=$_SESSION['session_name']; //声明一个名为ssvalue的变量 ?>
下面通过实例讲解存储和取回 $_SESSION 变量的方法。
<?php session_start(); // 存储会话变量的值 $_SESSION['views']=1; ?> <html> <body> <?php //读取会话变量的值 echo "浏览量=". $_SESSION['views']; ?> </body> </html>程序运行效果如下图所示:

图 1 程序运行效果
4、注销和销毁Session变量
注销会话变量使用 unset() 函数即可,如 unset($_SESSION['name']),不再需要使用 PHP 4 中的 session_unrgister() 或 session_unset()。unset() 函数用于释放指定的 Session 变量,代码如下:
<?php unset($_SESSION['views']); ?>如果要注销所有会话变量,只需要向 $_SESSION 赋值一个空数组就可以了,如
$_SESSION =array()
。注销完成后,使用 session_destory() 销毁会话即可,其实就是清除相应的 SessionID。其代码如下:<?php session_destroy(); ?>
PHP Session综合应用
下面通过一个综合案例讲解会话管理的综合应用。1) 在网站根目录下建立一个文件夹,名为 session。
2) 在 session 文件夹下建立 opensession.php,输入以下代码并保存:
<?php session_start(); $_SESSION['name'] = "王小明"; echo "会话变量为:".$_SESSION['name']; ?> <a href='usesession.php'>下一页</a>
3) 在 session 文件夹下建立 usesession.php,输入以下代码并保存:
<?php session_start(); echo "会话变量为:".$_SESSION['name']."<br/>"; echo $_SESSION['name'].",你好。"; ?> <a href='closesession.php'>下一页</a>
4) 在 session 文件夹下建立 closesession.php,输入以下代码并保存:
<?php session_start(); unset($_SESSION['name']); if (isset($_SESSION['name'])){ echo "会话变量为:".$_SESSION['name']; }else{ echo "会话变量已注销。"; } session_destroy(); ?>
5) 运行 opensession.php 文件,结果如下图所示:

图 2 程序运行结果
6) 单击页面中的“下一页”链接,运行结果如下图所示:

图 3 程序运行结果
7) 单击页面中的“下一页”链接,运行结果如下图所示:

图 4 程序运行结果