免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2281 | 回复: 2
打印 上一主题 下一主题

[转载]变量的“追随”:cookie与session [复制链接]

论坛徽章:
1
技术图书徽章
日期:2013-12-05 23:25:45
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-11-13 11:47 |只看该作者 |倒序浏览
[转载]变量的“追随”:cookie与session

  1. 在很多时候,我们需要跟踪浏览者在整个网站的活动,对他们身份进行自动或半自动的识别(也就是平时常说的网站登陆之类的功能),这时候,我们常采用一组变量来"追随"访客。实现变量"追随"有很多种方法,比较用得多的是cookie和session。下面我们用时下很流行的PHP为大家讲解一下它们的使用。
  2. 一.Cookie的使用

  3.   Cookie是网站保存在浏览器客户端的信息,也就是说保存在访客的机器里的变量,一般随着HTTP 头发送到客户端。在Cookie生效之后及失效之前,客户每次发出页面请求的时候,都会把Cookie一块发送到服务器,只要我们针对它进行相应的处理,就可以实现变量"追随"。

  4. 1. 设置一个Cookie变量

  5.   设置一个Cookie变量,PHP使用的函数是:

  6. int setcookie(string name, string value, int expire,
  7. string path, string domain, int secure);


  8.   其中name是Cookie变量名称标识,你在PHP中将可以象使用普通变量名一样来用它引用Cookie变量。value是Cookie变量的初始值,expire 表示该Cookie变量的有效时间;path 为该Cookie变量的相关路径;domain 表示Cookie变量的网站;secure 则需在 https 的安全传输时才有效。

  9.   例如我们要设置一个变量username,它的值是字符串"bluewind",我们可以这么写代码:

  10. setcookie ("username","bluewind"); //这两个参数是setcookie必要的。


  11.   我们还想给这个变量设置有效时间来限制操作超时等,比如说10分钟:

  12. setcookie ("username","bluewind", 600000); //有效时间的单位是毫秒。


  13.   注意:setcookie和header函数一样,需要放在任何能向客户端输出的语句之前。

  14. 2. 销毁一个变量

  15.   销毁Cookie变量只要将它的value设为空("")就可以了,如想销毁上面那个变量只要再写一次:

  16. setcookie ("username" ,"");


  17.   就可以了。这常用作安全退出之用。

  18. 3. Cookie的有效范围和生存期

  19.   Cookie的有效范围(也就是说在这个范围的页面都能得到这个Cookie变量)默认的是该目录及其子目录,当然你可以用setcookie的 path和domain参数进行修改。如果你不对cookie的expire进行设置(参见1. 设置一个Cookie变量中的例子),那么当你离开网站的页面,cookie也同时得到自动销毁。

  20.   http://www.netscape.com/newsref/std/cookie_spec.html是 cookie 原创者 Netscape 所提供的完整介绍信息。

  21. 二,session的使用

  22.   session变量,也就是会话级变量,是访客在整个和网站交互的过程中都存在的公有变量。在客户端不支持有可能不支持cookie的时候(比如 linux下的lynx......呵呵,惨了点),我们为了保证数据正确安全,就需要采用session变量。Session在各种网页语言中的实现方式不一样,PHP在4.0后也开始支持它了。首先,让我们来看看一个简单的例子:

  23. test.php
  24. -----------
  25. <?
  26. session_start();
  27. session_register(var); //注册变量var
  28. $var="这是SESSION变量的值"; //var变量已经被作为session变量
  29. ?>
  30. test1.php
  31. ------
  32. <?
  33. session_start();
  34. session_register(var);
  35. echo $var; //输出:"这是SESSION变量的值"
  36. ?>



  37. 1、初始一个session

  38.   如果PHP的设置自动session并没有开启的话,需要使用session_start()函数来初始化一个session,这个函数的用法如下:

  39. : boolean session_start(void);


  40.   它的作用是初始化一个新的 Session,若该客户已在 Session 之中,则连上原 Session。本函数没有参数,且返回值均为 true。

  41. 2、在session中注册一个变量

  42.   你要在session保存的变量都必须使用下列函数对变量进行注册:

  43. boolean session_register(string name);


  44.   本函数在全局变量中增加一个变量到目前的 Session 之中。参数 name 即为欲加入的变量名。成功则返回true 值。

  45.   然后你就可以直接使用变量名对它进行赋值,这个值就会被保存下来。

  46. 3、使用session变量的值

  47.   如上例所示,只要你再在新的页面重复上两个步骤(除了赋值外),就可以直接使用session变量。

  48. 4、session的销毁

  49.   如果你只是想注销一个变量而不是摧毁整个变量的话,那需要使用函数:

  50. boolean session_unregister(string name);


  51.   用法很简单,参数 name 即为欲删除的变量名。成功则返回 true 值。

  52.   但是,如果要整个"摧毁"session变量的话,比如说安全退出什么的,使用函数:

  53. boolean session_destroy(void);


  54.   本函数结束目前的 Session。本函数没有参数,且返回值均为 true。

  55. 5、其它有用的session函数

  56. a、 检查变量是否注册

  57. boolean session_is_registered(string name);


  58.   本函数可检查目前的 Session 之中是否已有指定的变量注册。参数 name 即为欲检查的变量名。成功则返回true 值。

  59. b、 给注册变量归null

  60. void session_unset(void);


  61.   这个函数可以把当然注册的所有的session变量置为空。注意它不是unregister,也不同于destroy。 下面这个例子,对此函数做了很好的说明。

  62. <?php
  63. session_register(a,b,c); //auto-session-start
  64. $a=1;
  65. $b=2;
  66. $c=3;
  67. session_unregister(a); //unregistrered $a
  68. echo "A: $a - reg:".session_is_registered(a)." ";
  69. // but the global $a remains
  70. session_unset(); // unsets $b und $c
  71. echo "B:$b - reg:".session_is_registered(b)." ";
  72. // the registration remains !
  73. echo "C:$c - reg:".session_is_registered(c)." ";
  74. echo session_encode();
  75. ?>

  76. 输出:
  77. A: 1 - reg:
  78. B: - reg:1
  79. C: - reg:1
  80. !b|!c|



  81. c、定制你自己的session处理方法

  82. void session_set_save_handler (string open, string close, string read,
  83. string write, string destroy, string gc)



  84.   这个函数可以定义用户级的session的保存函数(打开、关闭、写入等)。比如,我们想把session保存在本地的一个数据库中时,本函数就很有用了。缺省情况下,每个session存贮在系统临时目录的一个个独立文件中(例如在unix系统中为/tmp)。这适合或不适合,依你的需求而言。例如: 如果你的支持php的web服务器分布在不同的机器上,你不能很容易地共享它们之间的session(当然,你也可以将sessions保存在NFS共享中)。另一个潜在的问题是你机器上的数千或数百万个session文件使你的文件系统变得散乱。注意:这个函数是在4.0b4版本后才出现的。使用本函数前,先要配置php.ini文件,session.save_hadler=user ,否则,session_set_save_handler()不会生效。

  85.   此外,根据我的测试,你如果想让这样的session 跨页面使用,还要在每一个用到session的脚本文件中加入你自定的函数及session_set_save_handler,所以,最好的方法是做成一个单独的文件,在每一个要用到session的脚本中用include来包含进来。

  86.   下面这个例子提供了一个最基本的session保存法,类似于默认的files方法。如果你想用数据库来实现,这也是很容易做到的。

  87. Example:session_set_save_handler() example
  88. <?php
  89. function open ($save_path, $session_name) {
  90. global $sess_save_path, $sess_session_name;
  91. $sess_save_path = $save_path;
  92. $sess_session_name = $session_name;
  93. return(true);
  94. }
  95. function close() {
  96. return(true);
  97. }
  98. function read ($id) {
  99. global $sess_save_path, $sess_session_name;
  100. $sess_file = "$sess_save_path/sess_$id";
  101. if ($fp = @fopen($sess_file, "r")) {
  102. $sess_data = fread($fp, filesize($sess_file));
  103. return($sess_data);
  104. } else {
  105. return("");
  106. }

  107. }

  108. function write ($id, $sess_data) {
  109. global $sess_save_path, $sess_session_name;
  110. $sess_file = "$sess_save_path/sess_$id";
  111. if ($fp = @fopen($sess_file, "w")) {
  112. return(fwrite($fp, $sess_data));
  113. } else {
  114. return(false);
  115. }
  116. }
  117. function destroy ($id) {
  118. global $sess_save_path, $sess_session_name;
  119. $sess_file = "$sess_save_path/sess_$id";
  120. return(@unlink($sess_file));
  121. }

  122. /*********************************************
  123. * WARNING - You will need to implement some *
  124. * * sort of garbage collection routine here. *
  125. * *********************************************/
  126. function gc ($maxlifetime) {
  127. return true;
  128. }
  129. session_set_save_handler
  130. ("open", "close", "read", "write", "destroy", "gc");
  131. session_start();
  132. // proceed to use sessions normally
  133. // 现在你就可以象往常一样地使用session了。

  134. ?>
复制代码




/// 原文此处解释错误
我们还想给这个变量设置有效时间来限制操作超时等,比如说10分钟:
setcookie ("username","bluewind", 600000); //有效时间的单位是毫秒,这里可能是原作者参考了javascript。

  1. <?php
  2. // 设置一小时候后失效
  3. setcookie ("TestCookie", "", time() - 3600);
  4. setcookie ("TestCookie", "", time() - 3600, "/~rasmus/", ".example.com", 1);
  5. ?>
复制代码

[ 本帖最后由 HonestQiao 于 2005-11-13 12:52 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2005-11-13 12:37 |只看该作者
其中 setcookie() 关于 expire 的解释是错误的吧?!

expire 单位是秒, 意思是有效到距离1970/1/1/08:00:00 的总秒数为止, 如果设为 0 那么表示关掉浏览器就失效.
所以要设置有效时间为10分钟, 那么应该是 time() + 600 .

:p

论坛徽章:
1
技术图书徽章
日期:2013-12-05 23:25:45
3 [报告]
发表于 2005-11-13 12:50 |只看该作者
原帖由 hightman 于 2005-11-13 12:37 发表
其中 setcookie() 关于 expire 的解释是错误的吧?!

expire 单位是秒, 意思是有效到距离1970/1/1/08:00:00 的总秒数为止, 如果设为 0 那么表示关掉浏览器就失效.
所以要设置有效时间为10分钟, 那么应该是 time ...



感谢指出,
  1. <?php
  2. // set the expiration date to one hour ago
  3. setcookie ("TestCookie", "", time() - 3600);
  4. setcookie ("TestCookie", "", time() - 3600, "/~rasmus/", ".example.com", 1);
  5. ?>
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP