`
jimphei
  • 浏览: 38989 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

关于php的缓存技术

    博客分类:
  • php
阅读更多

在比较大型的项目中,如果没有用到缓存技术,那简直糟糕透了,java中常用dbcp或者proxool 连接池,相比java,php用的是页面缓存。下面是网络上抓来的一些缓存技术。
普遍缓存技术
数据缓存:这里所说的数据缓存是指数据库查询缓存,每次访问页面的时候,都会先检测相应的缓存数据是否存在,如果不存在,就连接数据库,得到数据,并把查询结果序列化后保存到文件中,以后同样的查询结果就直接从缓存表或文件中获得。

用的最广的例子看Discuz的搜索功能,把结果ID缓存到一个表中,下次搜索相同关键字时先搜索缓存表。
举个常用的方法,多表关联的时候,把附表中的内容生成数组保存到主表的一个字段中,需要的时候数组分解一下,这样的好处是只读一个表,坏处就是两个数据同步会多不少步骤,数据库永远是瓶颈,用硬盘换速度,是这个的关键点。
<!--more-->
页面缓存:

每次访问页面的时候,都会先检测相应的缓存页面文件是否存在,如果不存在,就连接数据库,得到数据,显示页面并同时生成缓存页面文件,这样下次访问的时候页面文件就发挥作用了。(模板引擎和网上常见的一些缓存类通常有此功能)

时间触发缓存:

检查文件是否存在并且时间戳小于设置的过期时间,如果文件修改的时间戳比当前时间戳减去过期时间戳大,那么就用缓存,否则更新缓存。

内容触发缓存:

当插入数据或更新数据时,强制更新缓存。

静态缓存:

这里所说的静态缓存是指静态化,直接生成HTML或XML等文本文件,有更新的时候重生成一次,适合于不太变化的页面,这就不说了。

以上内容是代码级的解决方案,我直接CP别的框架,也懒得改,内容都差不多,很容易就做到,而且会几种方式一起用,但下面的内容是服务器端的缓存方案,非代码级的,要有多方的合作才能做到

内存缓存:

Memcached是高性能的,分布式的内存对象缓存系统,用于在动态应用中减少数据库负载,提升访问速度。
java的dbcp我想就是内存缓存。
下面看各种php缓存的实现。
1、页面缓存

class cache {    
  //缓存目录    
  var $cacheRoot        = "./cache/";    
  //缓存更新时间秒数,0为不缓存    
  var $cacheLimitTime   = 0;    
  //缓存文件名    
  var $cacheFileName    = "";    
  //缓存扩展名    
  var $cacheFileExt     = "php";    
     
  /*   
   * 构造函数   
   * int $cacheLimitTime 缓存更新时间   
   */   
  function cache( $cacheLimitTime ) {    
    if( intval( $cacheLimitTime ) )     
      $this->cacheLimitTime = $cacheLimitTime;    
    $this->cacheFileName = $this->getCacheFileName();    
    ob_start();    
  }    
      
  /*   
   * 检查缓存文件是否在设置更新时间之内   
   * 返回:如果在更新时间之内则返回文件内容,反之则返回失败   
   */   
  function cacheCheck(){    
    if( file_exists( $this->cacheFileName ) ) {    
      $cTime = $this->getFileCreateTime( $this->cacheFileName );    
      if( $cTime + $this->cacheLimitTime > time() ) {    
        echo file_get_contents( $this->cacheFileName );    
        ob_end_flush();    
        exit;    
      }    
    }    
    return false;    
  }    
     
  /*   
   * 缓存文件或者输出静态   
   * string $staticFileName 静态文件名(含相对路径)   
   */   
  function caching( $staticFileName = "" ){    
    if( $this->cacheFileName ) {    
      $cacheContent = ob_get_contents();    
      //echo $cacheContent;    
      ob_end_flush();    
     
      if( $staticFileName ) {    
          $this->saveFile( $staticFileName, $cacheContent );    
      }    
     
      if( $this->cacheLimitTime )    
        $this->saveFile( $this->cacheFileName, $cacheContent );    
    }    
  }    
      
  /*   
   * 清除缓存文件   
   * string $fileName 指定文件名(含函数)或者all(全部)   
   * 返回:清除成功返回true,反之返回false   
   */   
  function clearCache( $fileName = "all" ) {    
    if( $fileName != "all" ) {    
      $fileName = $this->cacheRoot . strtoupper(md5($fileName)).".".$this->cacheFileExt;    
      if( file_exists( $fileName ) ) {    
        return @unlink( $fileName );    
      }else return false;    
    }    
    if ( is_dir( $this->cacheRoot ) ) {    
      if ( $dir = @opendir( $this->cacheRoot ) ) {    
        while ( $file = @readdir( $dir ) ) {    
          $check = is_dir( $file );    
          if ( !$check )    
          @unlink( $this->cacheRoot . $file );    
        }    
        @closedir( $dir );    
        return true;    
      }else{    
        return false;    
      }    
    }else{    
      return false;    
    }    
  }    
     
  /*   
   * 根据当前动态文件生成缓存文件名   
   */   
  function getCacheFileName() {    
    return  $this->cacheRoot . strtoupper(md5($_SERVER["REQUEST_URI"])).".".$this->cacheFileExt;    
  }    
     
  /*   
   * 缓存文件建立时间   
   * string $fileName   缓存文件名(含相对路径)   
   * 返回:文件生成时间秒数,文件不存在返回0   
   */   
  function getFileCreateTime( $fileName ) {    
    if( ! trim($fileName) ) return 0;    
     
    if( file_exists( $fileName ) ) {     
      return intval(filemtime( $fileName ));    
    }else return 0;    
  }    
      
  /*   
   * 保存文件   
   * string $fileName  文件名(含相对路径)   
   * string $text      文件内容   
   * 返回:成功返回ture,失败返回false   
   */   
  function saveFile($fileName, $text) {    
    if( ! $fileName || ! $text ) return false;    
     
    if( $this->makeDir( dirname( $fileName ) ) ) {    
      if( $fp = fopen( $fileName, "w" ) ) {    
        if( @fwrite( $fp, $text ) ) {    
          fclose($fp);    
          return true;    
        }else {    
          fclose($fp);    
          return false;    
        }    
      }    
    }    
    return false;    
  }    
     
  /*   
   * 连续建目录   
   * string $dir 目录字符串   
   * int $mode   权限数字   
   * 返回:顺利创建或者全部已建返回true,其它方式返回false   
   */   
  function makeDir( $dir, $mode = "0777" ) {    
    if( ! $dir ) return 0;    
    $dir = str_replace( "\\", "/", $dir );   
       
    $mdir = "";   
    foreach( explode( "/", $dir ) as $val ) {   
      $mdir .= $val."/";   
      if( $val == ".." || $val == "." || trim( $val ) == "" ) continue;    
          
      if( ! file_exists( $mdir ) ) {    
        if(!@mkdir( $mdir, $mode )){    
         return false;    
        }    
      }    
    }    
    return true;    
  }    
}    
?> 
include( "cache.php" );   
$cache = new cache(30);   
$cache->cacheCheck();   
echo date("Y-m-d H:i:s");   
$cache->caching();   

 
2、内存缓存
Memcache类。
Memcache是danga.com的一个项目,最早是为 LiveJournal 服务的,目前全世界不少人使用这个缓存项目来构建自己大负载的网站,来分担数据库的压力。
它可以应对任意多个连接,使用非阻塞的网络IO。由于它的工作机制是在内存中开辟一块空间,然后建立一个HashTable,Memcached自管理这些HashTable。
为什么会有Memcache和memcached两种名称?
其实Memcache是这个项目的名称,而memcached是它服务器端的主程序文件名,
Memcache官方网站:http://www.danga.com/memcached
Memcache工作原理
首先 memcached 是以守护程序方式运行于一个或多个服务器中,随时接受客户端的连接操作,客户端可以由各种语言编写,目前已知的客户端 API 包括 Perl/PHP/Python/Ruby/Java/C#/C 等等。客户端在与 memcached 服务建立连接之后,接下来的事情就是存取对象了,每个被存取的对象都有一个唯一的标识符 key,存取操作均通过这个 key 进行,保存到 memcached 中的对象实际上是放置内存中的,并不是保存在 cache 文件中的,这也是为什么 memcached 能够如此高效快速的原因。注意,这些对象并不是持久的,服务停止之后,里边的数据就会丢失。
与许多 cache 工具类似,Memcached 的原理并不复杂。它采用了C/S的模式,在 server 端启动服务进程,在启动时可以指定监听的 ip,自己的端口号,所使用的内存大小等几个关键参数。一旦启动,服务就一直处于可用状态。Memcached 的目前版本是通过C实现,采用了单进程,单线程,异步I/O,基于事件 (event_based) 的服务方式.使用 libevent 作为事件通知实现。多个 Server 可以协同工作,但这些 Server 之间是没有任何通讯联系的,每个 Server 只是对自己的数据进行管理。Client 端通过指定 Server 端的 ip 地址(通过域名应该也可以)。需要缓存的对象或数据是以 key->value 对的形式保存在Server端。key 的值通过 hash 进行转换,根据 hash 值把 value 传递到对应的具体的某个 Server 上。当需要获取对象数据时,也根据 key 进行。首先对 key 进行 hash,通过获得的值可以确定它被保存在了哪台 Server 上,然后再向该 Server 发出请求。Client 端只需要知道保存 hash(key) 的值在哪台服务器上就可以了。
        其实说到底,memcache 的工作就是在专门的机器的内存里维护一张巨大的 hash 表,来存储经常被读写的一些数组与文件,从而极大的提高网站的运行效率。
Memcache是danga.com的一个项目,最早是为 LiveJournal 服务的,目前全世界不少人使用这个缓存项目来构建自己大负载的网站,来分担数据库的压力。

它可以应对任意多个连接,使用非阻塞的网络IO。由于它的工作机制是在内存中开辟一块空间,然后建立一个HashTable,Memcached自管理这些HashTable。

   

为什么会有Memcache和memcached两种名称?

其实Memcache是这个项目的名称,而memcached是它服务器端的主程序文件名,

   

Memcache官方网站:http://www.danga.com/memcached

 

2       Memcache工作原理
首先 memcached 是以守护程序方式运行于一个或多个服务器中,随时接受客户端的连接操作,客户端可以由各种语言编写,目前已知的客户端 API 包括 Perl/PHP/Python/Ruby/Java/C#/C 等等。客户端在与 memcached 服务建立连接之后,接下来的事情就是存取对象了,每个被存取的对象都有一个唯一的标识符 key,存取操作均通过这个 key 进行,保存到 memcached 中的对象实际上是放置内存中的,并不是保存在 cache 文件中的,这也是为什么 memcached 能够如此高效快速的原因。注意,这些对象并不是持久的,服务停止之后,里边的数据就会丢失。

 

与许多 cache 工具类似,Memcached 的原理并不复杂。它采用了C/S的模式,在 server 端启动服务进程,在启动时可以指定监听的 ip,自己的端口号,所使用的内存大小等几个关键参数。一旦启动,服务就一直处于可用状态。Memcached 的目前版本是通过C实现,采用了单进程,单线程,异步I/O,基于事件 (event_based) 的服务方式.使用 libevent 作为事件通知实现。多个 Server 可以协同工作,但这些 Server 之间是没有任何通讯联系的,每个 Server 只是对自己的数据进行管理。Client 端通过指定 Server 端的 ip 地址(通过域名应该也可以)。需要缓存的对象或数据是以 key->value 对的形式保存在Server端。key 的值通过 hash 进行转换,根据 hash 值把 value 传递到对应的具体的某个 Server 上。当需要获取对象数据时,也根据 key 进行。首先对 key 进行 hash,通过获得的值可以确定它被保存在了哪台 Server 上,然后再向该 Server 发出请求。Client 端只需要知道保存 hash(key) 的值在哪台服务器上就可以了。
        其实说到底,memcache 的工作就是在专门的机器的内存里维护一张巨大的 hash 表,来存储经常被读写的一些数组与文件,从而极大的提高网站的运行效率。memcache 可用于java,请看http://www.iteye.com/topic/264010
这里讲php的实现
Memcache的安装
分为两个过程:memcache服务器端的安装和memcached客户端的安装。
所谓服务器端的安装就是在服务器(一般都是linux系统)上安装Memcache实现数据的存储
所谓客户端的安装就是指php(或者其他程序,Memcache还有其他不错的api接口提供)去使用服务器端的Memcache提供的函数,需要php添加扩展。

具体的配置大家可以参考:
Linux下的Memcache安装:http://www.ccvita.com/257.html
Windows下的Memcache安装:http://www.ccvita.com/258.html
Memcache基础教程:http://www.ccvita.com/259.html
Discuz!的Memcache缓存实现:http://www.ccvita.com/261.html
Memcache协议中文版:http://www.ccvita.com/306.html
Memcache分布式部署方案:http://www.ccvita.com/395.html

这里说下Memcached的例子

<?php
$memcache = new Memcache;
$memcache->connect('localhost', 11211) or die ("Could not connect");
$version = $memcache->getVersion();
echo "Server's version: ".$version."\n";
$tmp_object = new stdClass;
$tmp_object->str_attr = 'test';
$tmp_object->int_attr = 123;
$memcache->set('key', $tmp_object, false, 10) or die ("Failed to save data at the server");
echo "Store data in the cache (data will expire in 10 seconds)\n";
$get_result = $memcache->get('key');
echo "Data from the cache:\n";
var_dump($get_result);
?>
</pre>
读取的例子
<pre lang='php' line='1'>
<?php
$sql = 'SELECT * FROM users';
$key = md5($sql);   //memcached 对象标识符
if ( !($datas = $mc->get($key)) ) {
    //  在 memcached 中未获取到缓存数据,则使用数据库查询获取记录集。
    echo "n".str_pad('Read datas from MySQL.', 60, '_')."n";
    $conn = mysql_connect('localhost', 'test', 'test');
    mysql_select_db('test');
    $result = mysql_query($sql);
    while ($row = mysql_fetch_object($result))
        $datas[] = $row;
    //  将数据库中获取到的结果集数据保存到 memcached 中,以供下次访问时使用。
    $mc->add($key, $datas);
} else {
    echo "n".str_pad('Read datas from memcached.', 60, '_')."n";
}
var_dump($datas);
?>
</pre>


3、静态页面缓存如adodb+smarty实现缓存
<pre lang='php' line='1'>
<?php }
include(./adodb/adodb.inc.php); 
$ADODB_CACHE_DIR='tmp'; 
$db=NewADOConnect('mysql'); 
$db->connect('localhost','root','123456','mysql'); 
$sql="select * from user";  
$db->cacheexecute(300,$sql); 
?>
</pre>
在temp目录下生产缓存
<pre language='php' line='1'>
<
?php
require('./smarty/Smarty.class.php'); 
$smarty = new Smarty; Z)
$smarty->caching = true;
if(!$smarty->is_cached('index.tpl'))  
    // No cache available, do variable assignments here. )  
    $contents = get_database_contents(); 
    $smarty->assign($contents);
} 
$smarty->display('index.tpl'); )
?> 

 
还有别的缓存以后再整理

分享到:
评论

相关推荐

    php缓存技术总结

    PHP缓存技术是提高PHP应用性能的重要手段。它通过减少服务器的计算量、数据库查询次数以及网络传输数据量,来实现提高响应速度和降低服务器负载的目的。下面将详细解析php缓存技术涉及的关键知识点。 一、全页面...

    详解php缓存技术用于开发网站

    ### 详解PHP缓存技术在网站开发中的应用 在当今高度依赖互联网的时代,网站的响应速度和用户体验成为了吸引用户的关键因素。随着网站流量的增加,数据库的查询压力也随之增大,这不仅影响了网站的性能,还可能导致...

    详解php 缓存技术

    总结,PHP缓存技术是提高网站性能的重要手段,理解并合理运用各种缓存类型和策略,能够有效地提升应用的响应速度和用户体验。在实际开发中,应根据项目需求和资源状况选择合适的缓存方案,并不断优化和调整,以达到...

    PHP内存缓存技术memcached 的安装和工作原理介绍

    **PHP内存缓存技术memcached** 是一种广泛用于加速Web动态应用程序的分布式内存对象缓存系统。它通过存储数据在内存中,避免了反复查询数据库,显著提升了网站性能。memcached设计简洁,易于部署,支持多种编程语言...

    PHP 缓存 PHP 缓存

    #### 七、PHP 主要缓存技术 1. **Memcache:** - 分布式内存缓存服务,支持多台服务器间的共享缓存。 - 能够高效地处理大量并发请求。 2. **APC (Alternative PHP Cache):** - 是 PHP 的一个扩展,用于实现本地...

    PHP中Memcache缓存技术的使用

    Memcache缓存技术 安装 使用 教程 步骤的讲解

    PHP缓存技术详解(经典)

    ### PHP缓存技术详解 #### 引言 随着互联网技术的迅速发展,用户对网站响应速度的要求越来越高。作为一款流行的Web开发语言,PHP凭借其强大的功能和灵活性在网站建设中占据了重要地位。然而,在处理大量数据时,...

    网站缓存核心技术

    随着互联网技术的飞速发展,缓存技术成为支撑大规模网站高效稳定运行的关键组成部分之一。本文旨在深入探讨网站缓存的核心技术,并着重分析三种主流缓存技术——Ehcache、Memcached及Redis——之间的区别与应用场合...

    Memcache缓存技术,Memcache配置说明及其文件,PHP5.2.6版本内存缓存技术配置

    在本主题中,我们将详细探讨Memcache缓存技术,特别是针对PHP5.2.6版本的配置以及在Windows操作系统的应用。 首先,理解Memcache的基本原理至关重要。Memcache的工作机制是在内存中存储数据,当应用程序需要访问...

    PHP常见缓存技术分析(cache)

    **PHP常见缓存技术分析(cache)** 在Web开发中,缓存技术是提升系统性能的关键因素之一。PHP作为广泛使用的服务器端脚本语言,提供了多种缓存策略以优化应用程序的运行速度。本文将深入探讨PHP中的常见缓存技术,...

    PHP缓存与静态化——PHP缓存与静态化

    在构建高性能的Web应用时,PHP缓存与静态化扮演着至关重要的角色。它们能够显著提升网站的响应速度,减少服务器资源的消耗,尤其对于高流量的动态网站来说更是如此。下面将详细探讨这两个概念以及如何在PHP中实现...

    文档:PHP缓存技术详解

    ### PHP缓存技术详解 在IT领域,尤其是Web开发中,**PHP缓存技术**扮演着至关重要的角色,尤其在大型网站中,它能够显著提升性能,减轻服务器负担,优化用户体验。本文将深入探讨PHP缓存的核心概念、常用技术及其...

    韩顺平 PHP Memcached缓存技术资料源码笔记图解PPT_Ady

    【PHP Memcached缓存技术详解】 在Web开发中,数据缓存是一种常用的技术手段,用于提升网站性能,减少数据库负载。PHP Memcached扩展是PHP与Memcached缓存服务器交互的一个接口,它允许开发者将数据存储在内存中,...

    PHP 缓存详情机制

    在现代Web开发中,缓存技术扮演着极其重要的角色。合理的缓存策略不仅能显著提升应用性能,还能改善用户体验。对于PHP开发者而言,深入理解PHP缓存机制对于构建高效稳定的Web应用至关重要。本文将围绕PHP缓存机制...

    PHP缓存技术[总结].pdf

    PHP缓存技术是提高网站性能的关键手段,尤其是在处理大量数据和高并发访问时。本文将对几种常见的PHP缓存技术进行详细解释。 1. 数据缓存: 数据缓存主要针对数据库查询结果,目的是减少对数据库的直接访问,降低...

    PHP企业级应用之常见缓存技术篇

    本文将详细介绍PHP企业级应用中常见的缓存技术,并通过Discuz的搜索功能例子加以说明。 首先,我们来谈谈数据缓存。数据缓存主要针对的是数据库查询的缓存。在企业级应用中,数据库往往是最为沉重的性能瓶颈。通过...

Global site tag (gtag.js) - Google Analytics