php实现的Cookies操作类实例


Posted in PHP onSeptember 24, 2014

本文实例讲述了PHP实现的Cookies操作类及其用法,分享给大家供大家参考。具体分析如下:

一、功能:

1.保存,读取,更新,清除cookies数据。
2.可设置前缀。
3.强制超时控制。
4.cookies数据可以是字符串,数组,对象等。

二、用法:

Cookies.class.php类文件如下:

<?php 
/** Cookies class 保存,读取,更新,清除cookies数据。可设置前缀。强制超时。数据可以是字符串,数组,对象等。 
*  Date:  2013-12-22 
*  Author: fdipzone 
*  Ver:  1.0 
* 
*  Func: 
*  public  set    设置cookie 
*  public  get    读取cookie 
*  public  update   更新cookie 
*  public  clear   清除cookie 
*  public  setPrefix 设置前缀 
*  public  setExpire 设置过期时间 
*  private authcode  加密/解密 
*  private pack    将数据打包 
*  private unpack   将数据解包 
*  private getName  获取cookie name,增加prefix处理 
*/ 
 
class Cookies{ // class start 
 
  private $_prefix = '';                         // cookie prefix 
  private $_securekey = 'ekOt4_Ut0f3XE-fJcpBvRFrg506jpcuJeixezgPNyALm';  // encrypt key 
  private $_expire = 3600;                        // default expire 
 
  /** 初始化 
  * @param String $prefix   cookie prefix 
  * @param int  $expire   过期时间 
  * @param String $securekey cookie secure key 
  */ 
  public function __construct($prefix='', $expire=0, $securekey=''){ 
 
    if(is_string($prefix) && $prefix!=''){ 
      $this->_prefix = $prefix; 
    } 
 
    if(is_numeric($expire) && $expire>0){ 
      $this->_expire = $expire; 
    } 
 
    if(is_string($securekey) && $securekey!=''){ 
      $this->_securekey = $securekey; 
    } 
 
  } 
 
  /** 设置cookie 
  * @param String $name  cookie name 
  * @param mixed $value cookie value 可以是字符串,数组,对象等 
  * @param int  $expire 过期时间 
  */ 
  public function set($name, $value, $expire=0){ 
 
    $cookie_name = $this->getName($name); 
    $cookie_expire = time() + ($expire? $expire : $this->_expire); 
    $cookie_value = $this->pack($value, $cookie_expire); 
    $cookie_value = $this->authcode($cookie_value, 'ENCODE', $this->_securekey); 
 
    if($cookie_name && $cookie_value && $cookie_expire){ 
      setcookie($cookie_name, $cookie_value, $cookie_expire); 
    } 
 
  } 
 
  /** 读取cookie 
  * @param String $name  cookie name 
  * @return mixed     cookie value 
  */ 
  public function get($name){ 
 
    $cookie_name = $this->getName($name); 
 
    if(isset($_COOKIE[$cookie_name])){ 
 
      $cookie_value = $this->authcode($_COOKIE[$cookie_name], 'DECODE', $this->_securekey); 
      $cookie_value = $this->unpack($cookie_value); 
 
      return isset($cookie_value[0])? $cookie_value[0] : null; 
 
    }else{ 
      return null; 
    } 
 
  } 
 
  /** 更新cookie,只更新内容,如需要更新过期时间请使用set方法 
  * @param String $name  cookie name 
  * @param mixed $value cookie value 
  * @return boolean 
  */ 
  public function update($name, $value){ 
 
    $cookie_name = $this->getName($name); 
 
    if(isset($_COOKIE[$cookie_name])){ 
 
      $old_cookie_value = $this->authcode($_COOKIE[$cookie_name], 'DECODE', $this->_securekey); 
      $old_cookie_value = $this->unpack($old_cookie_value); 
 
      if(isset($old_cookie_value[1]) && $old_cookie_vlaue[1]>0){ // 获取之前的过期时间 
 
        $cookie_expire = $old_cookie_value[1]; 
 
        // 更新数据 
        $cookie_value = $this->pack($value, $cookie_expire); 
        $cookie_value = $this->authcode($cookie_value, 'ENCODE', $this->_securekey); 
 
        if($cookie_name && $cookie_value && $cookie_expire){ 
          setcookie($cookie_name, $cookie_value, $cookie_expire); 
          return true; 
        } 
      } 
    } 
    return false; 
  } 
 
  /** 清除cookie 
  * @param String $name  cookie name 
  */ 
  public function clear($name){ 
 
    $cookie_name = $this->getName($name); 
    setcookie($cookie_name); 
  } 
 
  /** 设置前缀 
  * @param String $prefix cookie prefix 
  */ 
  public function setPrefix($prefix){ 
 
    if(is_string($prefix) && $prefix!=''){ 
      $this->_prefix = $prefix; 
    } 
  } 
 
  /** 设置过期时间 
  * @param int $expire cookie expire 
  */ 
  public function setExpire($expire){ 
 
    if(is_numeric($expire) && $expire>0){ 
      $this->_expire = $expire; 
    } 
  } 
 
  /** 获取cookie name 
  * @param String $name 
  * @return String 
  */ 
  private function getName($name){ 
    return $this->_prefix? $this->_prefix.'_'.$name : $name; 
  } 
 
  /** pack 
  * @param Mixed $data   数据 
  * @param int  $expire  过期时间 用于判断 
  * @return 
  */ 
  private function pack($data, $expire){ 
 
    if($data===''){ 
      return ''; 
    } 
 
    $cookie_data = array(); 
    $cookie_data['value'] = $data; 
    $cookie_data['expire'] = $expire; 
    return json_encode($cookie_data); 
  } 
 
  /** unpack 
  * @param Mixed $data 数据 
  * @return       array(数据,过期时间) 
  */ 
  private function unpack($data){ 
 
    if($data===''){ 
      return array('', 0); 
    } 
 
    $cookie_data = json_decode($data, true); 
 
    if(isset($cookie_data['value']) && isset($cookie_data['expire'])){ 
 
      if(time()<$cookie_data['expire']){ // 未过期 
        return array($cookie_data['value'], $cookie_data['expire']); 
      } 
    } 
    return array('', 0); 
  } 
 
  /** 加密/解密数据 
  * @param String $str    原文或密文 
  * @param String $operation ENCODE or DECODE 
  * @return String      根据设置返回明文活密文 
  */ 
  private function authcode($string, $operation = 'DECODE'){ 
 
    $ckey_length = 4;  // 随机密钥长度 取值 0-32; 
 
    $key = $this->_securekey; 
 
    $key = md5($key); 
    $keya = md5(substr($key, 0, 16)); 
    $keyb = md5(substr($key, 16, 16)); 
    $keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length): substr(md5(microtime()), -$ckey_length)) : '';
 
    $cryptkey = $keya.md5($keya.$keyc); 
    $key_length = strlen($cryptkey); 
 
    $string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) : sprintf('%010d', 0).substr(md5($string.$keyb), 0, 16).$string; 
    $string_length = strlen($string); 
 
    $result = ''; 
    $box = range(0, 255); 
 
    $rndkey = array(); 
    for($i = 0; $i <= 255; $i++) { 
      $rndkey[$i] = ord($cryptkey[$i % $key_length]); 
    } 
 
    for($j = $i = 0; $i < 256; $i++) { 
      $j = ($j + $box[$i] + $rndkey[$i]) % 256; 
      $tmp = $box[$i]; 
      $box[$i] = $box[$j]; 
      $box[$j] = $tmp; 
    } 
 
    for($a = $j = $i = 0; $i < $string_length; $i++) { 
      $a = ($a + 1) % 256; 
      $j = ($j + $box[$a]) % 256; 
      $tmp = $box[$a]; 
      $box[$a] = $box[$j]; 
      $box[$j] = $tmp; 
      $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256])); 
    } 
 
    if($operation == 'DECODE') { 
      if((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16)) { 
        return substr($result, 26); 
      } else { 
        return ''; 
      } 
    } else { 
      return $keyc.str_replace('=', '', base64_encode($result)); 
    } 
  } 
} // class end 
 
?>

demo.php示例程序如下:

<?php 
require 'Cookies.class.php'; 
 
$type = isset($_GET['type'])? strtolower($_GET['type']) : ''; 
 
if(!in_array($type, array('set','get','update','clear'))){ 
  exit('type not exists'); 
} 
 
$obj = new Cookies('member', 10); // obj 
 
switch($type){ 
 
  case 'set': // 设置 
    $data = array( 
      'name' => 'fdipzone', 
      'gender' => 'male' 
    ); 
    $obj->set('me', $data, 5); 
    echo 'set cookies'; 
    break; 
 
  case 'get': // 读取 
    $result = $obj->get('me'); 
 
    echo '<pre>'; 
    print_r($result); 
    echo '</pre>'; 
 
    echo 'get cookies'; 
    break; 
 
  case 'update': // 更新 
    $data = array( 
      'name' => 'angelababy', 
      'gender' => 'female' 
    ); 
    $flag = $obj->update('me', $data); 
 
    if($flag){ 
      echo 'update cookies success'; 
    }else{ 
      echo 'update cookies false'; 
    } 
 
    break; 
 
  case 'clear': // 清除 
    $obj->clear('me'); 
    echo 'clear cookies'; 
    break; 
}
?>

本文完整实例源码点击此处本站下载。

希望本文所述对大家的PHP程序设计有所帮助。

PHP 相关文章推荐
php 调试利器debug_print_backtrace()
Jul 23 PHP
PHP转换文件夹下所有文件编码的实现代码
Jun 06 PHP
PHP 循环删除无限分类子节点的实现代码
Jun 21 PHP
关于使用key/value数据库redis和TTSERVER的心得体会
Jun 28 PHP
php图像处理函数大全(推荐收藏)
Jul 11 PHP
php使用curl发送json格式数据实例
Dec 17 PHP
ThinkPHP CURD方法之data方法详解
Jun 18 PHP
ThinkPHP 404页面的设置方法
Jan 14 PHP
使用PHP uniqid函数生成唯一ID
Nov 18 PHP
PHP编程入门的基本语法知识点总结
Jan 26 PHP
PHP-FPM运行状态的实时查看及监控详解
Nov 18 PHP
laravel实现图片上传预览,及编辑时可更换图片,并实时变化的例子
Nov 14 PHP
PHP实现支持GET,POST,Multipart/form-data的HTTP请求类
Sep 24 #PHP
php过滤html标记属性类用法实例
Sep 23 #PHP
php广告加载类用法实例
Sep 23 #PHP
php实现根据url自动生成缩略图的方法
Sep 23 #PHP
php实现的支持imagemagick及gd库两种处理的缩略图生成类
Sep 23 #PHP
PHP图片库imagemagick安装方法
Sep 23 #PHP
安装ImageMagick出现error while loading shared libraries的解决方法
Sep 23 #PHP
You might like
PHP 加密解密内部算法
2010/04/22 PHP
基于PHP5魔术常量与魔术方法的详解
2013/06/13 PHP
PHP设计模式之观察者模式定义与用法示例
2018/08/04 PHP
PHP下载文件函数与用法示例
2019/09/27 PHP
javascript 全等号运算符使用说明
2010/05/31 Javascript
javascript:void(0)的问题使用探讨
2014/04/10 Javascript
基于jquery实现简单的手风琴特效
2015/11/24 Javascript
解决js页面滚动效果scrollTop在FireFox与Chrome浏览器间的兼容问题的方法
2015/12/03 Javascript
详解Jquery实现ready和bind事件
2016/04/14 Javascript
深入解析Backbone.js框架的依赖库Underscore.js的作用
2016/05/07 Javascript
ajax接收后台数据在html页面显示
2017/02/19 Javascript
JS简单获取当前日期和农历日期的方法
2017/04/17 Javascript
详细分析JS函数去抖和节流
2017/12/05 Javascript
Vue.use源码学习小结
2018/06/20 Javascript
小程序实现多列选择器
2019/02/15 Javascript
JavaScript偏函数与柯里化实例详解
2019/03/27 Javascript
Vue 幸运大转盘实现思路详解
2019/05/06 Javascript
Promise扫盲贴
2019/06/24 Javascript
layui radio点击事件实现input显示和隐藏的例子
2019/09/02 Javascript
详解vue 自定义组件使用v-model 及探究其中原理
2019/10/11 Javascript
基于python元祖与字典与集合的粗浅认识
2017/08/23 Python
Python随机生成均匀分布在三角形内或者任意多边形内的点
2017/12/14 Python
python2爬取百度贴吧指定关键字和图片代码实例
2019/08/14 Python
Python 音频生成器的实现示例
2019/12/24 Python
Python实现bilibili时间长度查询的示例代码
2020/01/14 Python
Tensorflow卷积实现原理+手写python代码实现卷积教程
2020/05/22 Python
python的setattr函数实例用法
2020/12/16 Python
分享29个基于Bootstrap的HTML5响应式网页设计模板
2015/11/19 HTML / CSS
Luxplus荷兰:以会员价购买美容产品等,独家优惠
2019/08/30 全球购物
上海方立数码笔试题
2013/10/18 面试题
教师年终个人自我评价
2013/10/04 职场文书
管理科学大学生求职信
2013/11/13 职场文书
《九色鹿》教学反思
2014/02/27 职场文书
党员应该树立反腐倡廉的坚定意识思想汇报
2014/09/12 职场文书
中共广东省委常委会党的群众路线教育实践活动整改方案
2014/09/23 职场文书
详解Java实践之适配器模式
2021/06/18 Java/Android