www.2527.com_澳门新葡8455手机版_新京葡娱乐场网址_
做最好的网站

PHP中Memcache操作类使用方法,购物车类

2019-11-24 02:18 来源:未知

意气风发有关介绍1.memcache memcache的多服务器数据分享的介绍,请参见 称为sessionid,如若已带有八个sessionid则证实从前曾经为此顾客端成立过session,服务器就遵照sessionid把这些session检索出来使用,借使顾客端诉求不分包sessionid,则为此客商端创造多个session况兼生成四个与此session相关联的sessionid,sessionid的值应该是四个既不会重新,又不便于被找到规律以克隆的字符串,这些sessionid将被在本次响应中回到给顾客端保存。保存那几个sessionid的办法得以行使cookie,那样在竞相进程中浏览器能够自动的依据法则把那个标记发挥给服务器。平常那么些cookie的名字都是雷同于SEEESIONID,而。举个例子weblogic对于web应用程序生成的cookie,PHPSESSID=ByOK3vjFD75aPnrF3K2HmdnV6QZcEbzWoWiBYEnLerj,它的名字正是PHPSESSID。

 代码如下

有关 SESSION 在 php 中的应用是必不要少的,最要害的效用之意气风发,SESSION 在网络采取中,称为“会话”,大家何奇之有掌握为存款和储蓄特定客户会话所需的新闻,那样,当客户在网址页面之间跳转时,存款和储蓄的 SESSION 值不会丢弃,而是在总体顾客会话中平昔并存下来。通俗一点讲,就是当客户A上网时,会创造二个ID(a)值进行封存下来,假使您的ID(A)值未有开展注销,下一次上网时,那么些网址还有或者会记得您的ID(A)值,当时就能够在英特网举行调用你的ID(A)值了,举例款待您ID(A)值再一次访谈。

二动机 在其实web临蓐条件中,三个施用种类,往往将差异的工作使用遍布到不相同服务器上实行管理。当追踪当前在线客户新闻时,如若是同一个主域名时,可以用全域cookie处理有关数据的共享问题;借使是在不一样主域下,则能够透过旁观者格局的主导话概念解决相应难点,通过这种概念延伸出的缓慢解决方案有数不完,而昨天自己所要讲的,是前生机勃勃种,通过memcache的多服务器数据分享本事来效仿session,以拓宽对现阶段在线顾客数据的多服务器分享。至于多服务器统生机勃勃session音信,须要如下:1.力所能致在memcached规定的几台服务器上,保存session音讯(通过后边介绍的memcache的多服务器数据分享卡塔 尔(英语:State of Qatar);2.能力所能达到象zend定义的session_start()前,通过session_id那样,自定义session_id的值。3.能有助于的在系统运作时,切换memcached存款和储蓄的session消息和 用文件存款和储蓄的session新闻的操作。

<?php
    /*  author:凹凸曼(lyc)
    /*  email: jar-c@163.com
    /*  内存缓存管理
    */
class Yc_Memcache{
 private $memcache=null; 
 
 public function __construct(){
 }
 /**
    * 连接数据库
    *
    * @param mixed $host
    * @param mixed $port
    * @param mixed $timeout
    */
 public  function connect($host,$port=11211,$timeout=1){
  if(!function_exists(memcache_connect)){ return FALSE;}
  $this->memcache=@memcache_connect($host,$port,$timeout);
  if(empty($this->memcache)){
   return FALSE;
  }else{
   return TRUE;
  }
 }
    /**
    * 存放值
    *
    * @param mixed $key
    * @param mixed $var
    * @param mixed $flag   默以为0不降低  压缩状态填写:MEMCACHE_COMPRESSED
    * @param mixed $expire  暗许缓存时间(单位秒)
    */
 public function set($key,$var,$flag=0,$expire=10){
 
  $f=@memcache_set($this->memcache,$key,$var,$flag,$expire);
  if(empty($f)){
   return FALSE;
  }else{
   return TRUE;
  }
 }
    /**
    * 抽取相应的key的value
    *
    * @param mixed $key
    * @param mixed $flags
    * $flags 假使此值为1代表通过连串化,
    * 但未通过压缩,2评释压缩而未系列化,
    * 3表明压缩何况体系化,0表明未经过压缩和类别化
    */
 public function get($key,$flags=0){
  $val=@memcache_get($this->memcache,$key,$flags);
  return $val;
 }
 /**
    * 删除缓存的key
    *
    * @param mixed $key
    * @param mixed $timeout
    */
 public function delete($key,$timeout=1){
  $flag=@memcache_delete($this->memcache,$key,$timeout);
  return $flag;
 }
    /**
    * 刷新缓存但不自由内部存款和储蓄器空间
    *
    */
 public function flush(){
  memcache_flush($this->memcache);
 }
    /**
    * 关闭内部存款和储蓄器连接
    *
    */
 public function close(){
  memcache_close($this->memcache);
 }
    /**
    * 替换对应key的value
    *
    * @param mixed $key
    * @param mixed $var
    * @param mixed $flag
    * @param mixed $expire
    */
 public function replace($key,$var,$flag=0,$expire=1){
  $f=memcache_replace($this->memcache,$key,$var,$flag,$expire);
  return $f;
 }
    /**
    * 开启大值自动裁减
    *
    * @param mixed $threshold 单位b
    * @param mixed $min_saveings 暗中认可值是0.2表示五分三压缩率
    */
 public function setCompressThreshold($threshold,$min_saveings=0.2){
  $f=@memcache_set_compress_threshold($this->memcache,$threshold,$min_saveings);
  return $f;
 }
    /**
    * 用于获取贰个服务器的在线/离线状态
    *
    * @param mixed $host
    * @param mixed $port
    */
 public function getServerStatus($host,$port=11211){
  $re=memcache_get_server_status($this->memcache,$host,$port);
  return $re;
 }
    /**
    * 缓存服务器池中有着服务器总括音讯
    *
    * @param mixed $type 期待抓取的总计新闻项目,能够使用的值有{reset, malloc, maps, cachedump, slabs, items, sizes}
    * @param mixed $slabid  cachedump命令会完全占用服务器日常用于 相比严俊的调
    * @param mixed $limit 从服务端获取的实业条数
    */
 public function getExtendedStats($type='',$slabid=0,$limit=100){
  $re=memcache_get_extended_stats($this->memcache,$type,$slabid,$limit);
  return $re;
 }
}
 
/***********测量试验区域********************/
$mem=new Yc_Memcache();
 
$f=$mem->connect('125.64.41.138',12000);
var_dump($f);
if($f){
// $mem->setCompressThreshold(2000,0.2);
 $mem->set('key','hello',0,30);
//        var_dump($mem->delete('key1'));
 // $mem->flush();
// var_dump($mem->replace('hao','d'));
// echo $mem->get('key');
 echo $mem->getServerStatus('127.0.0.1',12000);
 echo $mem->get('key');
 echo '<pre>';
 print_r($mem->getExtendedStats());
}
 
?>

至于在 PHP 中运用 SESSION 值是比较轻松的,只要在下边提前输入 session_start() 起首对话就可以,下面就足以扩充利用 SESSION 了,那只是小网址的施用措施,实际上,SESSION 本身还应该有相当多个性,比方SESSION周期,调用SESSION,SESSION数据有效期,SESSION保存,SESSION注销等等,纵然有了这个属性,看起来才终于二个相比较正规的SESSION应用会话。

三代码贯彻方式超粗略,通过memcache来模拟session机制,只是使用memcache将储存媒介换到共享服务器的内存,以完毕多台布满式布署的服务器分享session音讯的目标。而调用的接口,与zend提供的session操作函数相分化,所以能够低价的在memcache和文书的session消息操作建切换。以下代码,已由此一再其实测量试验,能达到规定的标准以上成效要求。先贴上边了:复制代码 代码如下:/***=---------------------------------------------------------------------------=* MemcacheSession.class.php*=---------------------------------------------------------------------------=* * 实现基于Memcache存款和储蓄的 Session 成效* (模拟session机制,只是利用memcache将储存媒介换来分享服务器的内存)** 瑕玷:临时并未有引进差别主域的session分享机制的得以达成政策。即只支持同主域下的落到实处。* * Copyright 2008 by guigui. All rights reserved.* @author guigui * @version $Id: MemcacheSession.class.php, v 1.0 2008/12/22 $* @package systen* @link class MemcacheSession* * 1. 装置顾客端的Cookie来保存SessionID* 2. 把客商的数量保存在劳动器端,通过Cookie中的Session Id来规定叁个数据是或不是是客户的*/class MemcacheSession{ // {{{ 类成员属性定义 public $memObject = null;//memcache操作对象句柄 private $_sessId = ''; private $_sessKeyPrefix = 'sess_'; private $_sessExpireTime = 86400; private $_cookieDomain = '.guigui8.com';//全域cookie域名 private $_cookieName = '_PROJECT_MEMCACHE_SESS'; private $_cookieExpireTime = ''; private $_memServers = array('192.168.0.3' => 11211, '192.168.0.4' => 11211); private $_sessContainer = array();//当前客户的session消息private static $_instance = null;//本类单例对象 // }}} /** * 单例对象拿到的静态方法。* (能够顺便提供memcache新闻存款和储蓄的服务器参数) * * @param string $host - memcache数据存款和储蓄的服务器ip * @param integer $port - memcache数据存款和储蓄的服务器端口号 * @param bool $isInit - 是还是不是实例化对象的时候运营Session */ public static function getInstance($host='', $port=11211, $isInit = true) { if (null === self::$_instance) { self::$_instance = new self($host, $port, $isInit); } return self::$_instance; } /** * 构造函数 * * @param bool $isInit - 是不是实例化对象的时候运转Session */ private function __construct($host='', $port=11211, $isInit = false){ !empty && $this->_memServers = array; $isInit && $this->start(); } /***=-----------------------------------------------------------------------=*=-----------------------------------------------------------------------=* Public Methods*=-----------------------------------------------------------------------=*=-----------------------------------------------------------------------=*/ /** * 启动Session操作 * * @param int $expireTime - Session失效时间,缺省是0,当浏览器关闭的时候失效, 该值单位是秒 */ public function start{ $_sessId = $_COOKIE[$this->_cookieName]; if { $this->_sessId = $this->_getId(); $this->_cookieExpireTime = ? time() $expireTime : 0; setcookie($this->_cookieName, $this->_sessId, $this->_cookieExpireTime, "/", $this->_cookieDomain); $this->_initMemcacheObj(); $this->_sessContainer = array(); $this->_saveSession(); } else { $this->_sessId = $_sessId; $this->_sessContainer = $this->_getSession; } } /** * setSessId * * 自定义的session id,日常未有必要通过cookie操作管理的(所以省略了cookie记录session_id) * * @param string $sess_id * @return boolean */ public function setSessId{ $_sessId = trim; if { return false; } else { $this->_sessId = $_sessId; $this->_sessContainer = $this->_getSession; } } /** * 判别某些Session变量是不是注册 * * @param string $varName - * @return bool 存在重临true, 不设有再次回到false */ public function isRegistered{ if (!isset($this->_sessContainer[$varName])){ return false; } return true; } /** * 注册贰个Session变量 * * @param string $varName - 供给注册成Session的变量名 * @param mixed $varValue - 注册成Session变量的值 * @return bool - 该变量名已经存在再次回到false, 注册成功重返true */ public function set{ $this->_sessContainer[$varName] = $varValue; $this->_saveSession(); return true; } /** * 获取三个已注册的Session变量值 * * @param string $varName - Session变量的名称 * @return mixed - 一纸空文的变量重回false, 存在变量重临变量值 */ public function get{ if (!isset($this->_sessContainer[$varName])){ return false; } return $this->_sessContainer[$varName]; } /** * 销毁四个已注册的Session变量 * * @param string $varName - 供给销毁的Session变量名 * @return bool 销毁成功重返true */ public function delete{ unset($this->_sessContainer[$varName]); $this->_saveSession(); return true; } /** * 销毁全部曾经登记的Session变量 * * @return 销毁成功重回true */ public function destroy(){ $this->_sessContainer = array(); $this->_saveSession(); return true; } /** * 获取具备Session变量 * * @return array - 重返全体已注册的Session变量值 */ public function getAll(){ return $this->_sessContainer; } /** * 获取当前的Session ID * * @return string 获取的SessionID */ public function getSid(){ return $this->_sessId; } /** * 获取Memcache的服务器音讯 * * @return array Memcache配置数组音讯 */ public function getMemServers(){ return $this->_memServers; } /** * 设置Memcache的服务器音信 * * @param string $host - Memcache服务器的IP * @param int $port - Memcache服务器的端口 */ public function setMemServers{ $this->_memServers = $arr; } /** * 添加Memcache服务器 * * @param string $host - Memcache服务器的IP * @param int $port - Memcache服务器的端口 */ public function addMemServer{ $this->_memServers[trim; $this->memObject->addServer; } /** * 移除Memcache服务器(注意,这些只是移除配置,并无法实际从memcached的连接池移除) * * @param string $host - Memcache服务器的IP * @param int $port - Memcache服务器的端口 */ public function removeMemServer{unset($this->_memServers[trim; } /***=-----------------------------------------------------------------------=*=-----------------------------------------------------------------------=* Private Methods*=-----------------------------------------------------------------------=*=-----------------------------------------------------------------------=*/ /** * 生成二个Session ID * * @return string 再次来到四个33人的Session ID */ private function _getId(){ return md5; } /** * 获取三个保留在Memcache的Session Key * * @param string $_sessId - 是或不是钦定Session ID * @return string 获取到的Session Key */ private function _getSessKey{ $sessKey = ? $this->_sessKeyPrefix.$this->_sessId : $this->_sessKeyPrefix.$_sessId; return $sessKey; } /** * 检查保存Session数据的门道是不是存在 * * @return bool 成功重返true */ private function _initMemcacheObj(){ if (!class_exists || !function_exists{ $this->_showMessage('Failed: Memcache extension not install, please from download and install'); } if ($this->memObject && is_object{ return true; } $this->memObject = new Memcache; if (!empty { foreach ($this->_memServers as $_host => $_port) { $this->memObject->addServer; } } return true; } /** * 获取Session文件中的数据 * * @param string $_sessId - 必要拿到Session数据的SessionId * @return unknown */ private function _getSession{ $this->_initMemcacheObj(); $sessKey = $this->_getSessKey; $sessData = $this->memObject->get; if || empty{ //this must be $_COOKIE['__SessHandler'] error! return array(); } return $sessData; } /** * 把方今的Session数据保存到Memcache * * @param string $_sessId - Session ID * @return 成功再次来到true */ private function _saveSession{ $this->_initMemcacheObj(); $sessKey = $this->_getSessKey; if (empty($this->_sessContainer)){ $ret = @$this->memObject->set($sessKey, $this->_sessContainer, false, $this->_sessExpireTime); }else{ $ret = @$this->memObject->replace($sessKey, $this->_sessContainer, false, $this->_sessExpireTime); } if { $this->_showMessage('Failed: Save sessiont data failed, please check memcache server'); } return true; } /** * 展现提醒音讯 * * @param string $strMessage - 要求出示的音信内容 * @param bool $isFailed - 是还是不是是战败新闻, 缺省是true */ private function _showMessage($strMessage, $isFailed = true){ return; if { echo ; } echo $strMessage; } 四运用1.本土session存款和储蓄,与原始session操作方法近似,未有其他变动。如:复制代码 代码如下:session_start();$_SESSION['file_session_info']= '当麻芋果件保留的session音讯'; //当半夏件保留的session2.memcache分享服务器的session存款和储蓄复制代码 代码如下:$mem= MemcacheSession::getInstance;$mem->addMemServer;$mem->addMemServer;//借使cookie成效不可用,则基于别的参数字传送递的必须要经过的路音讯,设置映射为session_idif {$sn= '838ece1033bf7c7468e873e79ba2a3ec';$mem->setSessId;}$mem->set; //多台memcache服务器共享的session$mem->set; //多台memcache服务器分享的session//$mem->destroy();3.独家得到当地和memcache存储的session音讯复制代码 代码如下:$addr= $mem->get;$_MEM_SESSION= $mem->getAll();echo"

下边是八个完整的 Session 类,整合了 Session 最大旨的属性值,当中,展开,关闭与清理是契合php编制程序标准的,那也是一个很好的习贯。小小的说诺优能(Nutrilon卡塔 尔(英语:State of Qatar)下,倘诺网址不是大方接收Session 类,基本上就没供给接受 SESSION 类了。


 代码如下

localhost file session:";var_dump;echo"

 <?php
/**
* 文件叙述 Session类
* =================================================================
* 文件名称 session.class.php
* -----------------------------------------------------------------
* 适用条件: PHP5.2.x / mysql 5.0.x
* -----------------------------------------------------------------
* 作 者 04ie。com
* -----------------------------------------------------------------
* 成立时间 二零零六-2-1
* =================================================================
*/
class Session
{
/**
* session暗中同意有效时间
* @access public
* @var ineger $_expiry
*/
public $_expiry = 3600;
/**
* 有效域名
* @access public
* @var string $_domain
*/
public $_domain = '.phpfamily.cn';
//初始化
public function __construct()
{
ini_set('session.use_trans_id', 0);
ini_set('session.gc_maxlifetime', $this->_expiry);
ini_set('session.use_cookie', 1);
ini_set('session.cookie_path', '/');
ini_set('session.cookie_domain', $this->_domain);
session_module_name('user');
session_set_save_handler(
array(&$this, 'open'),
array(&$this, 'close'),
array(&$this, 'read'),
array(&$this, 'write'),
array(&$this, 'destroy'),
array(&$this, 'gc')
);
session_start();
}
/**
* 打开session
* @access public
* @param string $savePath
* @param string $sName
* @return true
*/
public function open($savePath, $sName)
{
$this->_conn = mysql_connect('localhost', 'root', '');
mysql_select_db('databases');
mysql_query('SET NAMES "utf8"');
return true;
}
/**
* 关闭session
* @access public
* @return bool
*/
public function close()
{
return mysql_close($this->_conn);
}
/**
* 读取session
* @access public
* @param string $sid sessionID
* @return mixed
*/
public function read($sid)
{
$sql = "SELECT data FROM sessions WHERE sessionid='%s'";
$sql = sprintf($sql, $sid);
$res = mysql_query($sql, $this->_conn);
$row = mysql_fetch_assoc($res);
return !$row ? null : $row['data'];
}
/**
* 写入session
* @access public
* @param string $sid sessionID
* @param string $data serialize连串化后的session内容
* @return
*/
public function write($sid, $data)
{
$expiry = time() $this->_expiry;
$sql = "REPLACE INTO sessions (sessionid,expiratio
n,data) VALUES ('%s', '%d', '%s')";
$sql = sprintf($sql, $sid, $expiry, $data);
mysql_query($sql, $this->_conn);
return true;
}
/**
* 销毁session
* @access public
* @param string $sid sessionID
* @return
*/
public function destroy($sid)
{
$sql = "DELETE FROM sessions WHERE sessionid='%s'";
$sql = sprintf($sql, $sid);
mysql_query($sql, $this->_conn);
return true;
}
/**
* 清理超时session
* @access public
* @param integer $time
* @return
*/
public function gc($time = 0)
{
$sql = "DELETE FROM sessions WHERE expiration < '%d'";
$sql = sprintf($sql, time());
mysql_query($sql, $this->_conn);
mysql_query('OPTIMIZE TABLE sessions');
return true;
}  


上面我们再看多少个php session购物车类

memcache session:";var_dump;//$res= $mem->delete;

 代码如下

<?php
class Cart{
 public function Cart() {
  if(!isset($_SESSION['cart'])){
   $_SESSION['cart'] = array();
  }
 }

 /*
 增多商品
 param int $id 商品主键
    string $name 商品名称
    float $price 商品价位
    int $num 购物数量
 */
 public  function addItem($id,$name,$price,$num,$img) {
  //假若该商品已存在则一贯加其数据
  if (isset($_SESSION['cart'][$id])) {
   $this->incNum($id,$num);
   return;
  }
  $item = array();
  $item['id'] = $id;
  $item['name'] = $name;
  $item['price'] = $price;
  $item['num'] = $num;
  $item['img'] = $img;
  $_SESSION['cart'][$id] = $item;
 }

 /*
 更正购物车中的商品数量
 int $id 商品主键
 int $num 某商品种改过过后的数码,即直接把某商品
 的多寡改为$num
 */
 public function modNum($id,$num=1) {
  if (!isset($_SESSION['cart'][$id])) {
   return false;
  }
  $_SESSION['cart'][$id]['num'] = $num;
 }

 /*
 商品数量 1
 */
 public function incNum($id,$num=1) {
  if (isset($_SESSION['cart'][$id])) {
   $_SESSION['cart'][$id]['num'] = $num;
  }
 }

 /*
 商品数量-1
 */
 public function decNum($id,$num=1) {
  if (isset($_SESSION['cart'][$id])) {
   $_SESSION['cart'][$id]['num'] -= $num;
  }

  //假使减弱后,数量为0,则把这么些商品删掉
  if ($_SESSION['cart'][$id]['num'] <1) {
   $this->delItem($id);
  }
 }

 /*
 删除商品
 */
 public function delItem($id) {
  unset($_SESSION['cart'][$id]);
 }
 
 /*
 获取单个商品
 */
 public function getItem($id) {
  return $_SESSION['cart'][$id];
 }

 /*
 查询购物车中货品的门类
 */
 public function getCnt() {
  return count($_SESSION['cart']);
 }
 
 /*
 查询购物车中货品的个数
 */
 public function getNum(){
  if ($this->getCnt() == 0) {
   //种数为0,个数也为0
   return 0;
  }

  $sum = 0;
  $data = $_SESSION['cart'];
  foreach ($data as $item) {
   $sum = $item['num'];
  }
  return $sum;
 }

 /*
 购物车中物品的总金额
 */
 public function getPrice() {
  //数量为0,价钱为0
  if ($this->getCnt() == 0) {
   return 0;
  }
  $price = 0.00;
  foreach ($this->items as $item) {
   $price = $item['num'] * $item['price'];
  }
  return sprintf(".2f", $price);
 }

 /*
 清空购物车
 */
 public function clear() {
  $_SESSION['cart'] = array();
 }
}

TAG标签:
版权声明:本文由澳门新葡8455手机版发布于计算机编程,转载请注明出处:PHP中Memcache操作类使用方法,购物车类