从此不求人:自主研发一套PHP前端开发框架(21)

本文介绍Memcache作为第三方缓存的应用场景及优势,包括支持多种编程语言、分布式部署能力及高效内存管理。提供了PHP环境下使用Memcache的具体步骤,并展示了如何在实际项目中实现缓存功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Memcache 简述

1.第三方的缓存,PHP、java、c#等主流语言都可以无障碍使用。
2.支持分布式部署(也就是可以多台服务器分担压力,提高性能)
3.数据放在内存中,比我们自己写的代码更加优秀德管理内存中的数据。

应用场景

1.交互式网站(非门户网站)
2.电商网站
3.部分BS后台应用(提高内存利用率)

PHP使用缓存的步骤

1.下载对应版本的memcache服务端
2.下载拓展库
如果是使用Linux可以上官网http://memcached.org有详细教程
3.
windows下仅供开发使用,不适合在正式环境中使用

编写一些代码

首先安装相应的拓展php_memcache.dll(本课时使用)
注意:细心的同学可能会发现 还有一个拓展叫做php_memcached.dll
两者不一样,在系统相对较复杂、压力大的情况下,推荐使用
后者性能更高、功能更强、稳定性更好
memcahe 拓展 http://cn2.php.net/memcache
memcahed 拓展 http://www.php.net/manual/zh/book.memcached.php

the_cache($key)
set_cache($key,$value,$expire);//超期时间,单位秒
Memcache事例代码
$m = new Memchache();
$m->connect('127.0.0.1',11211);//11211是默认端口号码

_Master.inc 代码如下

<?php 
  //所有controller的父类 抽象类 
  abstract class _Master{
     var $_view='index';//模板名称
     var $_vars = array();
     var $_cachetime=0;//缓存时间
     function setView($viewName){
         $this->_view = $viewName;
     }
     function getView(){
        return LKPHP_PATH.'/MVC/View/'.LKPHP_VIEWPATH.'/'.$this->_view.'.'.LKPHP_EXTENSION;
     }
     function setVar($varName,$varValue){
         //设置变量
        $this->_vars[$varName] = $varValue;
     }
     function hasVarCache(){
        if(the_cache($this->_view)){
            return true;
        }
        return false;
     }
     function run(){
        //解包变量
        if($this->_cachetime > 0){
            $getVars_cache = the_cache($this->_view);
            if($getVars_cache){
                echo '<b>这是从memcache中获取的数据</b><br/>';
                extract($getVars_cache);
            }else{
                //同时要设置缓存
                set_cache($this->_view,$this->_vars,0,$this->_cachetime);
                extract($this->_vars);
            }
        }else{
            extract($this->_vars);
        }
        extract($this->_vars);
        //加载头部模板
        include(LKPHP_PATH.'/MVC/View/'.LKPHP_VIEWPATH.'/'.LKPHP_VIEWHEADER.'.'.LKPHP_EXTENSION);
        include($this->getView());//加载模板body
        include(LKPHP_PATH.'/MVC/View/'.LKPHP_VIEWPATH.'/'.LKPHP_VIEWFOOTER.'.'.LKPHP_EXTENSION);//尾部
     }
     //魔术方法
    function __get($p){
        $c=load_class($p);
        return $c;
    }
  }
 ?>

functions.inc

<?php

   function load_db(){

     $db_path=LKPHP_PATH.'/Libary/DataBase/myDataBase.php';
     if(!class_exists('myDataBase')){
          require($db_path);
     }
     return new MyDataBase();

   }

   function load_model($modelName){

    $_Model_Path = LKPHP_PATH.'/MVC/Model/_Model.inc';//基类Model
    if(!class_exists('_Model')){
         require($_Model_Path);
    }
    $_mdPath = LKPHP_PATH.'/MVC/Model/'.$modelName.'.inc';//基类Model

    if(!class_exists($modelName)){
        require($_mdPath);
    }
    return new $modelName();

   }
   //加载虚拟类
   function load_class($class){
    $classPath = LKPHP_PATH.'/Libary/Class/myClass.php';

    if(!class_exists('myClass')){
        require($classPath);
    }
    return new myClass($class);
   }


// the_XXX系列

/*
 * 获取get参数
 * 当$ispost是true是代表获取post参数 默认是false 
 */
function the_get($get_key,$ispost=false)
 {
     $parameters=$ispost?$_POST:$_GET;
     if(!isset($parameters[$get_key])) return "";
     $str=$parameters[$get_key];
    //过滤危险字符、敏感字符通用函数
    //第一步:通过正则过滤掉我需要过滤的标记
     $farr = array(
    "/<(\/?)(script|i?frame|style|html|body|title|link|meta|\?|\%)([^>]*?)>/isU");
    //过滤类似 <script>  <style> <object>  <meta 等
     $str = preg_replace($farr,"",$str);
     $str=addslashes($str); //对单引号、双引号等预定义字符 前面加上反斜杠 如'变成\'

     //第二步 过滤敏感词汇

     $str=str_replace(explode(",", LKPHP_UNSAFEWORDS),"***",$str);
     return trim($str);
 }
 /*
  * 获取当前用户的IP地址,无参数
  */
 function the_ip()
 {
    if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown")) 
        $ip = getenv("HTTP_CLIENT_IP"); 
    else
        if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown")) 
            $ip = getenv("HTTP_X_FORWARDED_FOR"); 
        else
            if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown")) 
                $ip = getenv("REMOTE_ADDR"); 
            else
                if (isset ($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown")) 
                    $ip = $_SERVER['REMOTE_ADDR']; 
                else
                    $ip = "unknown"; 
    return ($ip); 
 }

 /*
  * 获取当前登录用户
  * 返回值是个model 如果用户没有登录则返回false
  */
 function the_user()
 {
    //可以使用cookie 也可以使用session
  $md = json_decode(myDecrypt($_COOKIE[LKPHP_USERCOOKIE],LKPHP_DESKEY));
    return isset($_COOKIE[LKPHP_USERCOOKIE])?$md :false;
 }

 //根据cacheKey或来获得缓存内容
function the_cache($cacheKey)
{
    //这里我们使用memcached
  $m = new Memcache();
  $m->connect(LKPHP_MEMCACHE_IP,LKPHP_MEMCACHE_PORT);
    return $m->get($cacheKey);
}
?>
<?php
 //is_XX系列  如判断用户是否登录 字符串格式

 /*
  * 判断用户是否登录
  */
  function is_login()
 {
    //用户是否登录
     if(the_user()) return true;
     return false;
 }

  //判断字符串是否符合email格式 
 function is_email($email)
 {
    return ereg("/^[a-z]([a-z0-9]*[-_\.]?[a-z0-9]+)*@([a-z0-9]*[-_]?[a-z0-9]+)+[\.][a-z]{2,3}([\.][a-z]{2})?$/i",$email);
 }
?>
<?php
  //set_XX系列,譬如更新缓存或者更新一个model

  //更新缓存
  function set_cache($cacheKey,$value,$expire)
  {
      $m = new Memcache();
      $m->connect(LKPHP_MEMCACHE_IP,LKPHP_MEMCACHE_PORT);
      return $m->set($cacheKey,$value,0,$expire);
  }
  //更新一个model
  function set_model($model)
  {

  }
  //设置当前登录用户
  function set_user($md,$time){
    if($time<0){
            //代表注销
        setcookie(LKPHP_USERCOOKIE,'',time()-3600,'/');
    }else{
        //代表登录成功
             $md = myCrypt(json_encode($md),LKPHP_DESKEY);
             setcookie(LKPHP_USERCOOKIE,$md,time()+$time,'/');//对对象进行json编码
    }
  }

   function pkcs5_pad ($text, $blocksize) {  //加密时的字节填充,保持和java 一致
        $pad = $blocksize - (strlen($text) % $blocksize);  
        return $text . str_repeat(chr($pad), $pad);  
   } 
   function myCrypt($input,$key) //加密
   {
        $size = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB);  
          $input =pkcs5_pad($input, $size);  
          $td = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_ECB, '');  
          $iv = mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND);  
          mcrypt_generic_init($td, $key, $iv);  
          $data = mcrypt_generic($td, $input);  
          mcrypt_generic_deinit($td);  
          mcrypt_module_close($td);  
          $data = base64_encode($data);  
          return $data; 
   }
   function myDecrypt($str,$key) //解密
   {
     $decrypted= mcrypt_decrypt(  
          MCRYPT_RIJNDAEL_128,  
          $key,  
          base64_decode($str),  
          MCRYPT_MODE_ECB  
      );  

          $dec_s = strlen($decrypted);  
          $padding = ord($decrypted[$dec_s-1]);  
          $decrypted = substr($decrypted, 0, -$padding);  
          return $decrypted; 
   }

?>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值