标签:session 频繁 在服务器 安全 art 公式 附加 相对 回收机制
Session会话是存储在服务器端的,相对比较安全,也并不像 Cookie 那样有存储长度的限制。
Session 工作原理
当启动一个 Session 会话时,会生成一个随机且唯一的 Session_id, 也就是 Session的文件名,此时 Session_id 存储在服务器的内存中。当关闭页面是此 id 会自动注销,重新登录此页面,会再次生成一个随机且唯一的 id。
Session的功能
Session 在 Web 技术中非常重要。例如,在电子商务网站中,通过 Session 记录用户登陆的信息,以及用户所购买的商品,如果没有 Session,那么用户每进入一个页面都需要登陆一次用户名和密码。
另外, Session 会话适用于存储信息量比较少的情况。 如果用户需要存储的信息量相对较少,并且对存储内容不需要长期存储,那么使用 Session 把信息存储到服务器端比较合适。
cookir的问题:用户有权阻止 Cookie 使用,使 Web 服务器无法通过 Cookie 来跟踪用户信息。而 Session 技术是将使用者相关的资料存放在服务器系统之下,所以使用者无法停止 Session 的使用。
php.ini设置参考项: 1. 处理session存取的模式 session.save_handler = files 2. session档案存放路径 session.save_path = /tmp 3. session使用cookie的功能,启动: 1 session.use_cookies = 1 4. session名字 session.name = PHPSESSID 5. 自动启动;0:关;1:开启 session.auto_start = 0 6. session使用cookie的生存期,以秒为单位 session.cookie_lifetime = 0 7. cookie有效作用域名 session.cookie_domain = "a.com" 8. 概率是 session.gc_probability/session.gc_divisor 结果 1/1000;不建议设置过小,因为session的垃圾回收,是需要检查每个文件是否过期的 session.gc_probability = 1 session.gc_divisor = 1000 9. 过期时间 默认24分钟 session.gc_maxlifetime = 1440
Session 的设置与 Cookie 不同,必须先行启动,在PHP中必须调用 session_start()函数,以便让 PHP 核心程序将和 Session相关的内建环境 变量预先载入到内存中。
注意: 通常,session_start()函数在页面开始位置调用,然后会话变量被登录到数据 $_SESSION。
说明:如果使用基于 Cookie 的 Session,在使用该函数开启 Session之前,不能有任何输出的内容。因为基于 Cookie 的 Session 实在开启的时候,调用 session_start()函数生成唯一的一个 Session ID,需要保存在客户端计算机的 Cookie 中,所以使用 session_start()函数之前浏览器不能有任何输出,即使是空格和空行也不行,否则会产生输出字符串产生的错误。
如果不想在每个脚本中都使用 session_start()函数 来开启 Session,可以在 php.ini 里面设置 session.auto_start = 1,就不需要每次使用 Session 之前都要调用 session_start()函数。但启用这个选项也是有一些限制的,就是不能将对象放入 Session 中,因为类定义必须在启动 Session 之前加载。 所以一般不建议使用session.auto_start来开启 Session。
注册Session会话
<?php session_start(); // 启动 Session $_SESSION[‘name‘] = null; // 声明一个名为 name 的变量,并设置为空值 null。 ?>
读取Session会话
例如:判断存储用户名的 Session 会话变量是否为空,如果不为空,则将该会话变量赋予 $my_value,其代码显示如下:
<?php if(!empty($_SESSION[‘session_name‘])){ //判断存储用户名的 Session 会话变量是否为空 $my_value = $_SESSION[‘session_name‘]; //将会话变量赋予一个变量 $my_value } ?>
当使用完一个 Session 变量后,可以将其删除;当完成一个会话以后,也可以将其销毁。如果用户想退出 Web 系统,就需要为他提供一个注销的功能,把他的所有信息在服务器中销毁。
(1)删除单个会话
删除单个会话即删除单个会话的变量、同数组的操作一样,直接注销 $_SESSION 数组 的某个元素即可。
例如: $_SESSION[‘user‘]变量,可以使用 unset()函数,代码如下所示:
unset( $_SESSION[‘user‘]);
注意: 使用 unset()函数时,要注意 $_SESSION 数组中元素不能省略,即不可以一次注销整个数组,这样会禁止整个会话的功能,如 unset($_SESSION)函数会将全局变量 $_SESSION 销毁,而且没有办法将其回复,用户也不能再注册 $_SESSION 变量。
(2)删除多个会话
如果想把某个用户在 Session 中注册的所有变量都删除,也就是删除多个会话即一次注销所有的会话变量,可以通过将一个空的数组赋值给 $_SESSION来实现,其代码显示如下:
$_SESSION = array();
(3)结束当前会话
如果整个会话已经结束,首先应该注销所有会话变量,然后使用 session_destroy()函数清除结束当前的会话,并清空会话中的所有资源,彻底销毁Session,其代码如下显示:
session_destroy();
下面将通过一个实例,提供完整的代码,运行该脚本后就可以关闭 Session,并销毁与本次会话有关的所有资源。
<?php //开启session session_start(); //删除所有session变量 $_SESSION = array(); //判断cookie中是否存在session id if(isset($_COOKIE[session_name()])){ setcookie(session_name(),‘‘,time()-3600,‘/‘); } //彻底销毁session session_destroy();
一般情况下,可以通过在页面提供的一个“退出” 按钮,单击来销毁本次会话。但是用户如果没有点击退出按钮,而是直接关闭浏览器,或者断网,或者断电直接关闭计算机等情况下,在服务器端保存的 Session 文件是不会被删除的。虽然关闭了浏览器,下次需要分配一个新的 Session ID 重新登录,但这只是因为在 php.ini 中的设置 session.cookie_lifetime = 0, 来设定 Session ID 在客户端 Cookie 中的有效期限,以秒为单位指定了发送到浏览器的 Cookie 的生命周期。值为0 表示 “直到关闭浏览器”,默认为 0.
当系统赋予 Session 有效期限后,不管浏览器是否开启,Session ID 都会自动消失。而客户端的 Session ID 消失,服务端保存的 Session 文件并没有被删除。所以没有被 Session ID 引用 的服务器端 Session 文件,就成为 “ 垃圾 ”。 为了防止这些垃圾 Session 文件对系统造成过大的负荷(因为 Session 并不像 Cookie 是一种半永久性的存在), 对于永远也用不上的 Session 文件(垃圾文件),系统有自动清理的机制。
“ 垃圾回收程序 ” 是什么样的启动机制呢?
“ 垃圾回收程序 ” 是在调用 session_start()函数时启动的。 而一个网站有多个脚本,每个脚本又都要使用 session_start()函数开启会话,又会有很多个用户同时访问,这就很有可能使得 session_start()函数在 1秒内被调用了 N 次,而如果每次都会启动 “ 垃圾回收程序 ” ,这样就很不合理了。即使最少控制在 15分钟以上启动一次 “ 垃圾回收程序 ” ,一天也要清理 100多次,这样太频繁了。 通过在 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 次才会启动一次 “ 垃圾回收程序 ” 。所以对会话页面访问越频繁,启动的概率就越来越小。一般的建议为 调用1000-5000次才会启动一次: 1/(1000~5000)。
1.通过 Cookie 来传递 Session ID
如果客户端没有禁止 Cookie,则在 PHP脚本中通过 session_start()函数进行初始化后,服务器会自动发送 HTTP 标头将 Session ID 保存到客户端计算机的 Cookie 中。
2. 通过 URL 来传递 Session ID
如果客户端浏览器支持 Cookie,就把 Session ID 作为 Cookie 保存在浏览器中。但如果用户禁止 Cookie 的使用,则浏览器中就不存在作为 Cookie 的 Session ID,因此在客户端请求中不包含 Cookie 信息。
在 PHP 中提供了跟踪 Session 的另一种机制,如果客户端浏览器不支持 Cookie,则 PHP 可以重写客户端请求 URL,把Session ID 添加到 URL 中。可以手动在每个超链接的 URL 中都添加一个 Session ID,这种方法工作量比较大,一般不建议使用这种方式。其示例的代码如下所示:
<?php //开启 session session_start(); // 在 URL 后面附加参数,变量名为session_name()获取的名称,值为session_id()获取 echo ‘<a href="test.php?‘.session_name().‘=‘.session_id().‘">演示</a>‘; ?>
标签:session 频繁 在服务器 安全 art 公式 附加 相对 回收机制
原文地址:https://www.cnblogs.com/chenyingying0/p/12963909.html