与 的设置不同,必须先启动 。在 PHP 中,必须调用 ()。 () 函数的语法格式如下:
Bool session_start(void) //创建Session,开始一个会话,进行Session初始化
登录并复制
注意:()函数前不能有任何输出
当你第一次访问某个网站时,()函数会创建一个唯一的ID,并自动通过HTTP响应头将该ID保存到客户端,同时在服务器上创建一个以该ID命名的文件,用于保存用户的会话信息。
当同一个用户再次访问网站时,HTTP 请求头中保存的 ID 会被自动结转。此时 () 函数不会分配新的 ID,而是在服务器硬盘上搜索与该 ID 同名的文件,读出之前为该用户保存的会话信息,并应用在当前脚本中,以达到跟踪用户的目的。以数组的形式使用,如:
$_SESSION['session名']
登录并复制
相关专题推荐:php(含图片、视频、案例)
注册会话变量并读取
在 PHP 中使用变量,除了启动变量外,还需要经过注册的过程。注册和读取变量都是通过访问 $ 数组来完成的。$ 关联数组中的键名与 PHP 中普通变量的命名规则相同。注册变量的代码如下:
代码如下
//启动session的初始化 session_start(); //注册session变量,赋值为一个用户的名称 $_SESSION["username"]="skygao"; //注册session变量,赋值为一个用户的ID $_SESSION["uid"]=1; ?>
登录并复制
执行脚本后,这两个变量会保存在服务器端的一个文件中,该文件的位置在php.ini文件的.属性指定的目录中。
取消注册变量并销毁
当一个变量被使用后,它可以被删除,当一个会话结束时,它也可以销毁。如果用户退出Web系统,需要给他提供一个注销函数,销毁他在服务器中的所有信息。要销毁与当前会话相关的所有信息,可以调用()函数结束当前会话,并清除会话中的所有资源。该函数的语法格式如下:
bool session_destroy(void) //销毁和当前Session有关的所有资料
登录并复制
该函数不会释放当前相关的变量,也不会删除客户端存储的变量。
ID。因为$array和自定义数组在使用上是一样的,所以我们可以使用unset()函数来释放注册的单个变量。如下所示:
unset($_SESSION['键名']);
登录并复制
一定要注意不要使用 unset($) 删除整个 $ 数组,否则将无法再通过 $ 超全局数组注册变量。但是,如果要删除某个用户在 中注册的所有变量,可以直接给数组变量 $ 赋值一个空数组。如下所示:
$_SESSION=array()
登录并复制
默认的 PHP 基于,
ID 存储在客户端的 中,因此注销时也需要清除已保存的 ID,这必须使用 () 函数来完成。在 PHP 脚本中,您可以通过调用 () 函数来获取名称。
ID,代码如下:
//判断Cookie中是否存在session ID if(isset($_COOKIE[session_name()])){ //删除包含Session ID的cookie,注意第四个参数一定要和php.ini设置的路径相同 setcookie(session_name(),'',time()-3600,'/'); } ?>
登录并复制
从前面的介绍可以得出注销过程总共需要四个步骤,下面的例子中给出了完整的四个步骤的代码,运行脚本可以关闭并销毁本次会话相关的所有资源,代码如下:
代码如下
//第一步:开启Session并初始化 session_start(); //第二部:删除所有Session的变量,也可以用unset($_SESSION[XXX])逐个删除 $_SESSION = array(); //第三部:如果使用基于Cookie的session,使用setCookkie()删除包含Session ID的cookie if(isset($_COOKIE[session_name()])) { setCookie(session_name(), "", time()-42000, "/"); } //第四部:最后彻底销毁session session_destroy(); ?>
登录并复制
配置选项
.=1,这样每次使用前就不需要调用 ()。不建议这么做。但是启用此选项有一些限制。如果确实启用了 .,则无法将对象放入会话中,因为必须在启动会话之前加载类定义才能在会话中重建对象。
自动垃圾回收机制
你可以使用()函数在页面上提供一个“退出”按钮,点击该按钮即可销毁当前会话。但是,如果用户没有点击退出按钮,而是直接关闭浏览器,或者断开网络连接,服务器上保存的文件并不会被删除。虽然关闭浏览器时需要重新分配一个新的ID才能下次再次登录,但这只是因为php.ini中的设置 .=0 设置了ID在客户端的有效期,并以秒为单位指定了发送给浏览器的生命周期。
当系统指定了过期时间,无论浏览器是否打开,该ID都会自动消失。但是客户端ID消失时,服务器上保存的文件并不会被删除。因此,没有被该ID引用的服务器端文件就成了“垃圾”。
服务器保存的文件是普通的文本文件,因此会有一个文件修改时间。
“垃圾回收程序”启动后,会根据文件的修改时间删除所有过期文件。您可以通过设置 php.ini 中的 . 选项来指定一个时间(以秒为单位)。例如,如果您将选项值设置为 1440(24 分钟),那么“垃圾回收程序”将检查所有文件,并删除所有修改时间距当前系统时间大于 1440 秒的文件。
“垃圾回收程序”的启动机制是怎样的?
“垃圾回收程序”是在 () 函数被调用时启动的。如果一个网站有多个脚本,并且没有脚本,它们都使用 () 函数启动会话,同时会有很多用户访问,那么很有可能 1 秒钟内 () 函数会被调用 N 次,每次都启动“垃圾回收程序”是不合理的。可以修改 php.ini 文件中的两个选项“.和。”来设置启动垃圾回收程序的概率。概率会根据“./。”公共语句来计算。例如,选项 .=1,而选项 .=100,则概率为“1/100”,即调用 () 函数 100 次后,才会启动一次“垃圾回收程序”。
php.ini中相关配置
禁用时 URL 中传递的 ID
追踪一个用户是通过在页面间传递一个唯一的ID,通过ID提取用户在服务器上保存的变量来实现的。ID的传递方式有两种常见方式。
第一种方法是根据方法传递ID,这种方法比较好,但是并不总是可用,因为用户可以在客户端阻止;
第二种方法是通过URL参数传递,将ID直接嵌入到URL中。
在 的实现中,客户端保存的ID通常为1,当客户端禁用时,该ID将无法保存在 中,无法在页面间传递,变为无效。但Linux平台的PHP5可以自动检查该状态,如果客户端禁用,系统会自动将ID附加到URL上进行传递。当将系统作为Web服务器使用时,无法使用此功能。
PHP 中提出了另外一种跟踪机制,如果客户端浏览器不支持,PHP 可以重写客户端请求的 URL,并将 ID 添加到 URL 信息中。你可以手动给每个超链接的 URL 添加一个 ID,但工作量比较大,不建议使用这种方法。如下图所示:
代码如下
//开启session session_start(); //在每个URL后面附加上参数,变量名为session_name()获取名称,值通过session_id()获取 echo '连接演示'; ?>
登录并复制
当使用 Linux 系统作为服务器时,如果在编辑 PHP 时使用了 --trans-sid 配置选项,并且激活了运行时选项 .,则在禁用客户端时,相对 URL 会被自动修改为包含会话 ID。如果没有配置,或者当使用系统作为服务器时,可以使用常量 SID。此常量是在启动会话时定义的。如果客户端没有发送合适的会话,SID 格式为 =,否则为空字符串。因此可以无条件地嵌入到 URL 中。下面的示例使用两个脚本来演示 ID 的传输方法。
session_start(); $_SESSION["username"]="admin"; echo "session ID:".session_id()." "; ?>
登录并复制
通过 URL 传递 ID
在脚本 test2.php 中输出脚本 test1.php 变量中保存的另一个用户名。在页面中再次输出 ID,对比两个脚本是否使用了相同的 ID。另外,在打开或关闭时,注意观察浏览器地址栏中 URL 的变化。代码如下:
代码如下
session_start(); echo $_SESSION["username"]."< br>"; echo "session ID:".session_id()." "; ?>
登录并复制
相关学习推荐:PHP编程从入门到精通
扫一扫在手机端查看
我们凭借多年的网站建设经验,坚持以“帮助中小企业实现网络营销化”为宗旨,累计为4000多家客户提供品质建站服务,得到了客户的一致好评。如果您有网站建设、网站改版、域名注册、主机空间、手机网站建设、网站备案等方面的需求,请立即点击咨询我们或拨打咨询热线: 13761152229,我们会详细为你一一解答你心中的疑难。