<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[沧海一粟]]></title> 
<link>http://www.dzhope.com/index.php</link> 
<description><![CDATA[Web系统架构与服务器运维,php开发]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[沧海一粟]]></copyright>
<item>
<link>http://www.dzhope.com/post//</link>
<title><![CDATA[变量的“追随”：cookie与session]]></title> 
<author>jed &lt;jed521@163.com&gt;</author>
<category><![CDATA[代码编程]]></category>
<pubDate>Thu, 07 Sep 2006 01:58:38 +0000</pubDate> 
<guid>http://www.dzhope.com/post//</guid> 
<description>
<![CDATA[ 
	在很多时候，我们需要跟踪浏览者在整个网站的活动，对他们身份进行自动或半自动的识别（也就是平时常说的网站登陆之类的功能），这时候，我们常采用一组变量来“追随”访客。实现变量“追随”有很多种方法，比较用得多的是cookie和session。下面我们用时下很流行的php为大家讲解一下它们的使用。 <br/><br/>一.cookie的使用 <br/><br/>　　cookie是网站保存在浏览器客户端的信息，也就是说保存在访客的机器里的变量，一般随着http头发送到客户端。在cookie生效之后及失效之前，客户每次发出页面请求的时候，都会把cookie一块发送到服务器，只要我们针对它进行相应的处理，就可以实现变量“追随”。 <br/><br/>1． 设置一个cookie变量 <br/><br/>　　设置一个cookie变量，php使用的函数是： <br/><br/>int setcookie(string name, string value, int expire, <br/>string path, string domain, int secure); <br/><br/><br/>　　其中name是cookie变量名称标识，你在php中将可以象使用普通变量名一样来用它引用cookie变量。value是cookie变量的初始值，expire 表示该cookie变量的有效时间；path 为该cookie变量的相关路径；domain 表示cookie变量的网站；secure 则需在 https 的安全传输时才有效。 <br/><br/>　　例如我们要设置一个变量username，它的值是字符串“bluewind”，我们可以这么写代码： <br/><br/>setcookie (“username”,“bluewind”); //这两个参数是setcookie必要的。 <br/><br/><br/>　　我们还想给这个变量设置有效时间来限制操作超时等，比如说10分钟： <br/><br/>setcookie (“username”,“bluewind”, 600000); //有效时间的单位是毫秒。 <br/><br/><br/>　　注意：setcookie和header函数一样，需要放在任何能向客户端输出的语句之前。 <br/><br/>2． 销毁一个变量 <br/><br/>　　销毁cookie变量只要将它的value设为空（“”）就可以了，如想销毁上面那个变量只要再写一次： <br/><br/>setcookie (“username” ,“”); <br/><br/><br/>　　就可以了。这常用作安全退出之用。 <br/><br/>3． cookie的有效范围和生存期 <br/><br/>　　cookie的有效范围（也就是说在这个范围的页面都能得到这个cookie变量）默认的是该目录及其子目录，当然你可以用setcookie的path和domain参数进行修改。如果你不对cookie的expire进行设置（参见1. 设置一个cookie变量中的例子），那么当你离开网站的页面，cookie也同时得到自动销毁。 <br/><br/>二,session的使用 <br/><br/>　　session变量，也就是会话级变量，是访客在整个和网站交互的过程中都存在的公有变量。在客户端不支持有可能不支持cookie的时候（比如linux下的lynx……呵呵，惨了点），我们为了保证数据正确安全，就需要采用session变量。session在各种网页语言中的实现方式不一样，php在4.0后也开始支持它了。首先，让我们来看看一个简单的例子： <br/><br/><br/>test.php <br/>----------- <br/><? <br/>session_start(); <br/>session_register(var); //注册变量var <br/>$var="这是session变量的值"; //var变量已经被作为session变量 <br/>?> <br/>test1.php <br/>------ <br/><? <br/>session_start(); <br/>session_register(var); <br/>echo $var; //输出：“这是session变量的值” <br/>?> <br/><br/> <br/><br/>1、初始一个session <br/><br/>　　如果php的设置自动session并没有开启的话，需要使用session_start（）函数来初始化一个session，这个函数的用法如下： <br/><br/>: boolean session_start(void); <br/><br/><br/>　　它的作用是初始化一个新的 session，若该客户已在 session 之中，则连上原 session。本函数没有参数，且返回值均为 true。 <br/><br/>2、在session中注册一个变量 <br/><br/>　　你要在session保存的变量都必须使用下列函数对变量进行注册： <br/><br/>boolean session_register(string name); <br/><br/><br/>　　本函数在全局变量中增加一个变量到目前的 session 之中。参数 name 即为欲加入的变量名。成功则返回true 值。 <br/><br/>　　然后你就可以直接使用变量名对它进行赋值，这个值就会被保存下来。 <br/><br/>3、使用session变量的值 <br/><br/>　　如上例所示，只要你再在新的页面重复上两个步骤（除了赋值外），就可以直接使用session变量。 <br/><br/>4、session的销毁 <br/><br/>　　如果你只是想注销一个变量而不是摧毁整个变量的话，那需要使用函数： <br/><br/>boolean session_unregister(string name); <br/><br/><br/>　　用法很简单，参数 name 即为欲删除的变量名。成功则返回 true 值。 <br/><br/>　　但是，如果要整个“摧毁”session变量的话，比如说安全退出什么的，使用函数： <br/><br/>boolean session_destroy(void); <br/><br/><br/>　　本函数结束目前的 session。本函数没有参数，且返回值均为 true。 <br/><br/>5、其它有用的session函数 <br/><br/>a、 检查变量是否注册 <br/><br/>boolean session_is_registered(string name); <br/><br/><br/>　　本函数可检查目前的 session 之中是否已有指定的变量注册。参数 name 即为欲检查的变量名。成功则返回true 值。 <br/><br/>b、 给注册变量归null <br/><br/>void session_unset(void); <br/><br/><br/>　　这个函数可以把当然注册的所有的session变量置为空。注意它不是unregister，也不同于destroy。 下面这个例子，对此函数做了很好的说明。 <br/><br/><br/><?php <br/>session_register('a','b','c'); //auto-session-start <br/>$a=1; <br/>$b=2; <br/>$c=3; <br/>session_unregister('a'); //unregistrered $a <br/>echo "a: $a - reg:".session_is_registered('a')." "; <br/>// but the global $a remains <br/>session_unset(); // unsets $b und $c <br/>echo "b:$b - reg:".session_is_registered('b')." "; <br/>// the registration remains ! <br/>echo "c:$c - reg:".session_is_registered('c')." "; <br/>echo session_encode(); <br/>?> <br/><br/>输出： <br/>a: 1 - reg: <br/>b: - reg:1 <br/>c: - reg:1 <br/>!b&#124;!c&#124; <br/><br/> <br/><br/>c、定制你自己的session处理方法 <br/><br/><br/>void session_set_save_handler (string open, string close, string read, <br/>string write, string destroy, string gc) <br/><br/> <br/><br/>　　这个函数可以定义用户级的session的保存函数（打开、关闭、写入等）。比如，我们想把session保存在本地的一个数据库中时，本函数就很有用了。缺省情况下,每个session存贮在系统临时目录的一个个独立文件中(例如在unix系统中为/tmp)。这适合或不适合，依你的需求而言。例如:如果你的支持php的web服务器分布在不同的机器上,你不能很容易地共享它们之间的session（当然，你也可以将sessions保存在nfs共享中）。另一个潜在的问题是你机器上的数千或数百万个session文件使你的文件系统变得散乱 。注意：这个函数是在4.0b4版本后才出现的。使用本函数前，先要配置php.ini文件，session.save_hadler=user ，否则，session_set_save_handler()不会生效。 <br/><br/>　　此外，根据我的测试，你如果想让这样的session跨页面使用，还要在每一个用到session的脚本文件中加入你自定的函数及session_set_save_handler，所以，最好的方法是做成一个单独的文件，在每一个要用到session的脚本中用include来包含进来。 <br/><br/>　　下面这个例子提供了一个最基本的session保存法，类似于默认的files方法。如果你想用数据库来实现，这也是很容易做到的。 <br/><br/><br/>example：session_set_save_handler() example <br/><?php <br/>function open ($save_path, $session_name) &#123; <br/>global $sess_save_path, $sess_session_name; <br/>$sess_save_path = $save_path; <br/>$sess_session_name = $session_name; <br/>return(true); <br/>&#125; <br/>function close() &#123; <br/>return(true); <br/>&#125; <br/>function read ($id) &#123; <br/>global $sess_save_path, $sess_session_name; <br/>$sess_file = "$sess_save_path/sess_$id"; <br/>if ($fp = @fopen($sess_file, "r")) &#123; <br/>$sess_data = fread($fp, filesize($sess_file)); <br/>return($sess_data); <br/>&#125; else &#123; <br/>return(""); <br/>&#125; <br/><br/>&#125; <br/><br/>function write ($id, $sess_data) &#123; <br/>global $sess_save_path, $sess_session_name; <br/>$sess_file = "$sess_save_path/sess_$id"; <br/>if ($fp = @fopen($sess_file, "w")) &#123; <br/>return(fwrite($fp, $sess_data)); <br/>&#125; else &#123; <br/>return(false); <br/>&#125; <br/>&#125; <br/>function destroy ($id) &#123; <br/>global $sess_save_path, $sess_session_name; <br/>$sess_file = "$sess_save_path/sess_$id"; <br/>return(@unlink($sess_file)); <br/>&#125; <br/><br/>/********************************************* <br/>* warning - you will need to implement some * <br/>* * sort of garbage collection routine here. * <br/>* *********************************************/ <br/>function gc ($maxlifetime) &#123; <br/>return true; <br/>&#125; <br/>session_set_save_handler <br/>("open", "close", "read", "write", "destroy", "gc"); <br/>session_start(); <br/>//　proceed to use sessions normally <br/>//　现在你就可以象往常一样地使用session了。 <br/><br/>?><br/><br/><br/><br/>Tags - <a href="http://www.dzhope.com/tags/session/" rel="tag">session</a>
]]>
</description>
</item><item>
<link>http://www.dzhope.com/post//#blogcomment</link>
<title><![CDATA[[评论] 变量的“追随”：cookie与session]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://www.dzhope.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>