当前位置:首页 > PHP教程 > php会话 > 列表

php cookie操作之队列操作类

发布:smiling 来源: PHP粉丝网  添加日期:2014-08-29 13:24:02 浏览: 评论:0 

文章从最简单的cookie操作(增加,删除,修改)到我们的cookie队列操作类的操作,有需要了解的同学可以参考本实例.

1、设置Cookie

1. PHP 的COOKIE

cookie 是一种在远程浏览器端储存数据并以此来跟踪和识别用户的机制。 

PHP 在http 协议的头信息里发送cookie,因此 setcookie() 函数必须在其它信息被输出到浏览器前调用,这和对  header() 函数的限制类似.

1.1 设置cookie:

可以用 setcookie()或 setrawcookie()函数来设置 cookie,也可以通过向客户端直接发送http  头来设置.

1.1.1 使用 setcookie()函数设置cookie:

bool setcookie ( string name [, string value [,int expire [,string path [,string domain [,bool secure [,bool httponly]]]]]] ) 

name: cookie 变量名

value: cookie 变量的值

expire: 有效期结束的时间

path: 有效目录

domain: 有效域名,顶级域唯一

secure: 如果值为 1,则cookie 只能在https 连接上有效,如果为默认值 0,则http 和 https 都可以.

来看几个例子,简单的:SetCookie("MyCookie", "Value of MyCookie");

带失效时间的.代码如下:

SetCookie("WithExpire", "Expire in 1 hour", time()+3600);//3600秒=1小时

什么都有的,代码如下:

SetCookie("FullCookie", "Full cookie value", time()+3600, "/forum", ".phpuser.com", 1);

我们需要用到队列,代码如下:

  1. class QueueSvc 
  2. {/*{{{*/ 
  3.     private $length// 队列的长度 
  4.     private $server_arr
  5.      
  6.     public function __construct($length,$server_arr
  7.     { 
  8.         $this->length = $length
  9.         $this->server_arr = $server_arr
  10.     } 
  11.      
  12.     public function getServerArr() 
  13.     { 
  14.         return $this->server_arr; 
  15.     } 
  16.      
  17.     public function set($server_name
  18.     { 
  19.         self::push($server_name); 
  20.     } 
  21.      
  22.     private function push($server_name
  23.     { 
  24.         //有重复的记录,把重复的删掉 
  25.         if(self::isServerExist($server_name)){ 
  26.             self::removeRepeat($server_name); 
  27.         }else
  28.             if(self::isFull()){ 
  29.                 //如果已经满了,要把队列最后一个记录删掉 
  30.                 array_pop($this->server_arr); 
  31.             } 
  32.         } 
  33.         //如果队列为空,先置为空数组 
  34.         if(emptyempty($this->server_arr)) 
  35.             $this->server_arr = array(); 
  36.         //向队列头添加数据  
  37.         array_unshift($this->server_arr,$server_name);   
  38.     } 
  39.      
  40.     private function isFull() 
  41.     { 
  42.         if(is_array($this->server_arr) && (count($this->server_arr) >= $this->length)) 
  43.             return true; 
  44.         return false;  
  45.     } 
  46.      
  47.     private function isServerExist($server_name
  48.     { 
  49.         if(is_array($this->server_arr) && in_array($server_name,$this->server_arr)) 
  50.             return true; 
  51.         return false; 
  52.     } 
  53.      
  54.     private function removeRepeat($server_name
  55.     { 
  56.         if(is_array($this->server_arr) && in_array($server_name,$this->server_arr)) 
  57.         { 
  58.             foreach($this->server_arr as $key=>$value
  59.             { 
  60.                 if($server_name == $value
  61.                 { 
  62.                     $this->array_remove($this->server_arr,$key); 
  63.                 } 
  64.             }    
  65.         } 
  66.     } 
  67.      
  68.     private function array_remove(&$arr$offset) {      
  69.         array_splice ( $arr$offset, 1 );  
  70.     } 
  71. }/*}}}*/require_once('queue_svc.php'); 
  72. class CookieSvc 
  73. {/*{{{*/ 
  74.     const   COOKIE_KEY = "GAME_SERVER"
  75.      
  76.     const   SEPARATE   = "|"
  77.  
  78.     const   COOKIE_LENGTH = "2"
  79.      
  80.     public function getCookieArr() 
  81.     {/*{{{*/ 
  82.         $server_str =  $_COOKIE[self::COOKIE_KEY]; 
  83.         $server_str =  $_COOKIE['GAME_SERVER']; 
  84.         if($server_str == ''){ 
  85.             $result =  array(); 
  86.         }else
  87.             $result = explode(self::SEPARATE,$server_str); 
  88.         } 
  89.         return $result
  90.     }/*}}}*/ 
  91.      
  92.     public function set($cookie_id
  93.     {/*{{{*/ 
  94.         $server_arr = self::getCookieArr(); 
  95.         if($cookie_id != false) 
  96.         {//开源代码phpfensi.com 
  97.             $que = new QueueSvc(self::COOKIE_LENGTH,$server_arr); 
  98.             $que->set($cookie_id); 
  99.             $server_new = $que->getServerArr(); 
  100.             if(is_array($server_new)) 
  101.             { 
  102.                 $cookie_str = implode(self::SEPARATE,$server_new); 
  103.                 setcookie(self::COOKIE_KEY,$cookie_str,time()+3600,'/'); 
  104.             } 
  105.         } 
  106.     }/*}}}*/ 
  107. }/*}}}*/ 

不多解释了,这个别人用的不多,昨天因为需要写的,留一下吧,也许以后还用得到,调用的代码很简单,代码如下:

  1. require_once("queue_svc.php"); 
  2.  
  3. require_once("cookie_svc.php"); 
  4.  
  5. $cookie_id = '4'
  6.  
  7. CookieSvc::set($cookie_id); 

这样就可以了,大家可以每次把$cookie_id换做不同的值,来检验此操作,检验的代码可以用如下代码:

var_dump($_COOKIE);

常见问题解决:

1) 用 setcookie()时有错误提示,可能是因为调用setcookie()前面有输出或空格。也可能你的文档是从其他字符集转换过来,文档后面可能带有 BOM 签名(就是在文件内容添加一些隐藏的BOM 字符),解决的办法就是使你的文档不出现这种情况,还有通过使用ob_start()函数也能处理一点.

2) $_COOKIE 受magic_quotes_gpc 影响,可能自动转义.

3) 使用的时候,有必要测试用户是否支持cookie.

Tags: php cookie操作 cookie修改

分享到: