`

cookie和会话(三)

    博客分类:
  • php
 
阅读更多

1:如何传输会话ID

会话ID在cookie中发送,cookie的名字就是会话名,在下一次调用session_start时,php会从这个cookie获得会话ID,并检查与给定相关联的会话程序存贮,如果没有得到数据,就创建一个新的数据集。但是,一些用户将浏览器配置为不接受cookie。如果会话机制完全依赖于cookie,那么这就有问题了。php对此有个方案,当它探测到不能使用cookie时,它可以将会话ID作为参数放在页面访问的URL中。这样做的优点是即使用户禁止了cookie,我们也能够跟踪用户在Web程序中的进展。要启用这种功能必须打开php.ini中session.use_trand_sid,并且确保session.onlu_cookies配置选项设置为0。尽管这个很方便,但是不常用,将会话ID放在明文的cookie中已经形成了一个安全问题。

2:页面缓存

对于会话数据要考虑的问题之一是浏览器缓存。客户机Web浏览器利用这种特性将下载的页面副本保存在本地机器上,从而避免从新获得页面。对于静态内容,这可以节省时间和网络宽带,因为用户可能多次访问给定的页面,而页面的内容已经保存在本地机器上了。其他网络设备也可能进行页面缓存。有些网络上有代理服务器,它们缓存HTML数据,一些大型Web站点可能有专用的缓存机器,它们唯一的工作就是减少Web应用服务器的流量。但是对于敏感内容页面缓存可能造成危害。不缓存这些信息,php提供一个session_cache_limiter的函数。

这个函数最常用的值和返回值是:public这表示任何人都可以缓存这个页面及相关内容。这适合静态内容。

private这告诉客户机可以缓存这个页面中的数据,其他设备比如代理服务器和网络设备不应该缓存它,这适合有点儿敏感的静态内容。

nocache(默认值)这告诉途中的任何设备都不应该缓存这个页面内容。这适合敏感或动态的内容。

no-store这指示所有设备和计算机不应该缓存页面内容和任何关联的内容。

这可以控制页面在不同的缓存中存储多长时间。session_cache_expire函数在会话中控制。这个函数返缓存过期时间的当前值,以分钟为单位。如果传递参数,就将心的过期时间设置为这个值。默认3小时(180分钟)

$timeout = session_cache_expire();

session_cache_expire(15);

session_start();

echo "the cache expire timeout:{$timeout}min";

通过使用比较短的缓存过期时间就可以再一定程度上获得缓存的好处,同时不破坏应用程序的动态性质。

php.ini这这里选项的默认值

session.cache_liliter nocache

session.cache_expire 180

3:破坏会话

1>破坏一个会话分三个单独的部分,每个部分需要不同的代码首先需要破坏会话数据,这些数据在默认的情况下存储在服务器硬盘上,这要使用session_destroy();

2>第二步是破坏事件的会话,这需要消除会话cookie。通过使用setcookie函数并指定一个过去的时间久可以再客户机上消除会话cookie。如果没有执行这一步,那么用户以后对这个站点的请求会附带发送他的会话cookie,而且一会调用session_start时仍然会返回同样的会话ID。

3>最后一步是破坏$_SESSION超级全局变量,从而删除与会话管理的任何数据,办法给它赋一个新值。

session_destroy();

setcookie(session_name(),'',time() - 3600);

$_SESSION = array();

 4:会话存储如何工作

在默认情况下,php将会话写入一个文件并将它放在session.save_path配置选项的指定位置。

在穿件一个新会话并且分配一个会话ID时,php在这个目录中写一个文件,文件名以sess_开头,以会话ID结束。每次在泽火革会话下操作的页面完成执行时,php将$_SESSION数组中的数据写入这个文件。下一次启动统一会话php从这个文件装载并且重新创建这个数组。php定期遍历这些文件,寻找过期的会话并且删除它们。这适合中小型的Web应用程序。但是,当编写大型的Web应用程序并开始跨多个服务器负载时,就会出现一个问题。在这种情况下属于统一会话的不同请求可能会被发送到不同的服务器。如果会话数据值保存在一台服务器上的存储文件中,那么就无法从另一台服务器访问它!一种可能的解决方案借助于给予网络的文件系统。封号的解决方案是使用数据库进行存储。因为数据库具有良好的可靠性,并发性和事务处理的功能。session_set_save_handler函数正是为此设计的。这个函数接收到 参数是6个函数的名称,应该用这些函数进行会话处理。

open这个函数用来开始会话存储机制。它必须在成时放回TRUE在失败时返回FALSE。

close这个函数关闭并终止会话存储操作。它在成功时返回TRUE失败时返回FALSE。

read当从存储中装载会话数据时使用这个函数。这个函数的参数是要获取器数据的会话ID。它在成功时放回请求的会话数据。在失败时返回“”。

write这个函数将给定的会话ID的所有数据写到存储中。写入的这些数据时一大段文本。这个函数在成功时返回TRUE失败返回FALSE。

destroy当破坏与指定的会话ID相关联的数据时,调用这个函数。它在完成时返回TRUE。

gc这个函数对存储系统中的数据进行垃圾收集。传递给这个函数的参数是会话数据的有效期(秒数).这个函数子啊成功时返回TRUE。

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics