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;
}
?>