- 浏览: 13731193 次
- 性别:
- 来自: 洛杉矶
文章分类
- 全部博客 (1994)
- Php / Pear / Mysql / Node.js (378)
- Javascript /Jquery / Bootstrap / Web (435)
- Phone / IOS / Objective-C / Swift (137)
- Ubuntu / Mac / Github / Aptana / Nginx / Shell / Linux (335)
- Perl / Koha / Ruby / Markdown (8)
- Java / Jsp (12)
- Python 2 / Wxpython (25)
- Codeigniter / CakePHP (32)
- Div / Css / XML / HTML5 (179)
- WP / Joomla! / Magento / Shopify / Drupal / Moodle / Zimbra (275)
- Apache / VPN / Software (31)
- AS3.0/2.0 / Flex / Flash (45)
- Smarty (6)
- SEO (24)
- Google / Facebook / Pinterest / SNS (80)
- Tools (22)
最新评论
-
1455975567:
xuezhongyu01 写道wocan23 写道我想问下那个 ...
Mysql: LBS实现查找附近的人 (两经纬度之间的距离) -
xuezhongyu01:
wocan23 写道我想问下那个111.1是怎么得来的我也看不 ...
Mysql: LBS实现查找附近的人 (两经纬度之间的距离) -
18335864773:
试试 pageoffice 在线打开 PDF 文件吧. pag ...
jquery在线预览PDF文件,打开PDF文件 -
青春依旧:
opacity: 0.5; 个人喜欢这种方式!关于其他css特 ...
css透明度的设置 (兼容所有浏览器) -
July01:
推荐用StratoIO打印控件,浏览器和系统的兼容性都很好,而 ...
搞定网页打印自动分页问题
在大部份情况下我们的网站都会使用数据库作为站点数据存储的容器。当你执行一个SQL查询时,典型的处理过程 是:连接数据库->准备SQL查询->发送查询到数据库->取得数据库返回结果->关闭数据库连接。但数据库中有些数据是完全静 态的或不太经常变动的,缓存系统会通过把SQL查询的结果缓存到一个更快的存储系统中存储,从而避免频繁操作数据库而很大程度上提高了程序执行时间,而且 缓存查询结果也允许你后期处理。
普遍使用的缓 存技术
数据缓存:这里所说的数据缓存是指数据库查询缓存,每次访问页面的时候,都会先检测相应的缓存数据是否存 在,如果不存在,就连接数据库,得到数据,并把查询结果序列化后保存到文件中,以后同样的查询结果就直接从缓存文件中获得。
页面缓存:
每次访问页面的时候,都会先检测相应的缓存页面文件是否存在,如果不存在,就连接数据库,得到数据,显示 页面并同时生成缓存页面文件,这样下次访问的时候页面文件就发挥作用了。(模板引擎和网上常见的一些缓存类通常有此功能)
内存缓存:
在里就不介绍了,不是本文所要讨论的,只简单提一下:
Memcached是高性能的,分布式的内存对象缓存系统,用于在动态应用中减少数据库负载,提升访问速 度。
dbcached 是一款基于 Memcached 和 NMDB 的分布式 key-value 数据库内存缓存系统。
以上的缓存技术虽然能很好的解决频繁查询数据库的问题,但其缺点在在于数据无时效性,下面我给出我在项目 中常用的方法:
时间触发缓 存:
检查文件是否存在并且时间戳小于设置的过期时间,如果文件修改的时间戳比当前时间戳减去过期时间戳大,那 么就用缓存,否则更新缓存。
设定时间内不去判断数据是否要更新,过了设定时间再更新缓存。以上只适合对时效性要求不高的情况下使用 ,否则请看下面。
内容触发缓 存:
当插入数据或更新数据时,强制更新缓存。
在这里我们可以看到,当有大量数据频繁需要更新时,最后都要涉及磁盘读写操作。怎么解决呢?我在日常项目 中,通常并不缓存所有内容,而是缓存一部分不经常变的内容来解决。但在大负荷的情况下,最好要用共享内存做缓存系统。
到这里PHP缓存也许有点解决方案了,但其缺点是,因为每次请求仍然要经过PHP解析,在大负荷的情况下 效率问题还是比效严重,在这种情况下,也许会用到静态缓存。
静态缓存
这里所说的静态缓存是指HTML缓存,HTML缓存一般是无需判断数据是否要更新的,因为通常在使用 HTML的场合一般是不经常变动内容的页面。数据更新的时候把HTML也强制更新一下就可以了。
实例1:
<?php /* 实 例: include("cache.php"); $cache = new cache(30); $cache->cacheCheck(); echo date("Y-m-d H:i:s"); $cache->caching(); */ 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; } } $cache = new cache(30); $cache->cacheCheck(); echo date("Y-m-d H:i:s"); $cache->caching(); ?>
实例2: 数据缓存
<?php class Cache { private $dir = 'cache'; private $expiration = 3600; function __construct($dir = '') { if(!empty($dir)){ $this->dir = $dir; } } private function _name($key) { return sprintf("%s/%s", $this->dir, sha1($key)); } public function get($key, $expiration = '') { if ( !is_dir($this->dir) OR !is_writable($this->dir)) { return FALSE; } $cache_path = $this->_name($key); if (!@file_exists($cache_path)) { return FALSE; } $expiration = empty($expiration) ? $this->expiration : $expiration; if (filemtime($cache_path) < (time() - $expiration)) { $this->clear($key); return FALSE; } if (!$fp = @fopen($cache_path, 'rb')) { return FALSE; } flock($fp, LOCK_SH); $cache = ''; if (filesize($cache_path) > 0) { $cache = unserialize(fread($fp, filesize($cache_path))); } else { $cache = NULL; } flock($fp, LOCK_UN); fclose($fp); return $cache; } public function set($key, $data) { if ( !is_dir($this->dir) OR !is_writable($this->dir)) { $this->_makeDir($this->dir); } $cache_path = $this->_name($key); if ( ! $fp = fopen($cache_path, 'wb')) { return FALSE; } if (flock($fp, LOCK_EX)) { fwrite($fp, serialize($data)); flock($fp, LOCK_UN); } else { return FALSE; } fclose($fp); @chmod($cache_path, 0777); return TRUE; } public function clear($key) { $cache_path = $this->_name($key); if (file_exists($cache_path)) { unlink($cache_path); return TRUE; } return FALSE; } public function clearAll() { $dir = $this->dir; if (is_dir($dir)) { $dh=opendir($dir); while (false !== ( $file = readdir ($dh))) { if($file!="." && $file!="..") { $fullpath=$dir."/".$file; if(!is_dir($fullpath)) { unlink($fullpath); } else { delfile($fullpath); } } } closedir($dh); // rmdir($dir); } } private 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; } }
例子:
<? require_once('cache.php'); $cache = new Cache(); $data = $cache->get('key'); if ($data === FALSE) { $data = 'This will be cached'; $cache->set('key', $data); echo $data.'--first time'; } echo $data; //$cache->clearAll(); //$cache->clear('key'); //Do something with $data
另一个数据缓存:
<?php class file_cache { private $root_dir; public function __construct ($root_dir) { $this->root_dir = $root_dir; if (FALSE == file_exists($this->root_dir)) { mkdir($this->root_dir, 0700, true); } } public function set ($key, $value) { $key = $this->escape_key($key); $file_name = $this->root_dir . '/' . $key; $dir = dirname($file_name); if (FALSE == file_exists($dir)) { mkdir($dir, 0700, true); } file_put_contents($file_name, serialize($value), LOCK_EX); } public function get ($key) { $key = $this->escape_key($key); $file_name = $this->root_dir . '/' . $key; if (file_exists($file_name)) { return unserialize(file_get_contents($file_name)); } return null; } public function remove ($key) { $key = $this->escape_key($key); $file = $this->root_dir . '/' . $key; if (file_exists($file)) { unlink($file); } } public function remove_by_search ($key) { $key = $this->escape_key($key); $dir = $this->root_dir . '/' . $key; if (strrpos($key, '/') < 0) $key .= '/'; if (file_exists($dir)) { $this->removeDir($dir); } } private function escape_key ($key) { return str_replace('..', '', $key); } function removeDir($dirName) { $result = false; $handle = opendir($dirName); while(($file = readdir($handle)) !== false) { if($file != '.' && $file != '..') { $dir = $dirName . DIRECTORY_SEPARATOR . $file; is_dir($dir) ? $this->removeDir($dir) : unlink($dir); } } closedir($handle); rmdir($dirName) ? true : false; return $result; } } $data_1 = array( 'u_id' => 1, 'name' => '利沙' ); $data_2 = array( 'u_id' => 2, 'name' => 'WaWa' ); $cache = new file_cache("test"); $cache->set("user/1/data", $data_1); //保存数据 $cache->set("user/2/data", $data_2); //保存数据 $result = $cache->get("user/1/data"); //获取数据 echo '测试如下:<pre>'; print_r($result); //$cache->remove("user/1/data"); //删除数据 //$cache->remove_by_search("user", $data_1); //删除user节点下所有数据
附两个较好的其他缓存类
- cacherphpclass-2001-10-31.rar (9.3 KB)
- 下载次数: 40
- mycache-2006-09-12.rar (85 KB)
- 下载次数: 41
发表评论
-
PHP: 在类(class)中加载动态函数, 变量函数或半变量函数 variable function/method
2016-09-03 07:54 7171最终实例在下方 以前 ... -
MySQL入门 (七) : 储存引擎与资料型态
2016-09-03 07:49 45531 表格与储存引擎 表格(table)是资料库中用来储存 ... -
MySQL入门 (六) : 字元集与资料库
2016-09-03 07:47 45661 Character Set与Collation 任何 ... -
MySQL入门 (五) : CRUD 与资料维护
2016-09-03 07:46 54811 取得表格资讯 1.1 DESCRIBE指令 「 ... -
MySQL入门 (四) : JOIN 与UNION 查询
2016-09-03 07:42 45001 使用多个表格 在「world」资料库的「countr ... -
PHP: 关键字global 和 超全局变量$GLOBALS的用法、解释、区别
2016-08-31 12:07 5039$GLOBALS 是一个关联数组,每一个变量为一个 ... -
MySQL入门 (三) : 运算式与函式
2016-08-31 12:01 4383运算式(expressions)已经 ... -
MySQL入门 (二) : SELECT 基础查询
2016-08-31 11:56 46811 查询资料前的基本概念 1.1 表格、纪录 ... -
MySQL入门 (一) : 资料库概论与MySQL的安装
2016-08-31 11:51 44571. 储存与管理资料 储存与管理资料一直是资讯应用上最基本 ... -
MySQL入门 (九) : 子查询 Subquery
2016-08-30 02:26 44471 一个叙述中的查询叙述 子查询(subquery)是一 ... -
PHP: 用readonly取代disabled来获取input值 submit a disabled input in a form could not ge
2016-08-30 02:21 2706The form is like below; <f ... -
PHP7革新与性能优化
2016-08-30 02:20 2146有幸参与2015年的PHP技 ... -
Mysql: 图解 inner join、left join、right join、full outer join、union、union all的区别
2016-08-18 06:03 3122对于SQL的Join,在学习起来可能是比较乱的。我们知道, ... -
Comet 反Ajax: 基于jQuery与PHP实现Ajax长轮询(LongPoll)
2016-08-18 06:00 1377传统的AJAX轮询方式,客服端以用户定义的时间间隔去服务器上 ... -
PHP:ServerPush (Comet推送) 技术的探讨
2016-08-18 05:58 1039PHP中Push(推送)技术的探讨 [http://vi ... -
PHP: 手把手编写自己的 MVC 框架实例教程
2016-08-16 05:33 18131 什么是MVC MVC模式(Model-View-Con ... -
PHP5: mysqli 插入, 查询, 更新和删除 Insert Update Delete Using mysqli (CRUD)
2016-07-29 12:55 1747原文: PHP5: mysqli 插入, 查询, 更新 ... -
MongoDB 教程索引 (附有视频)
2016-07-27 10:54 736MongoDB 教程索引 MongoDB 教程一: ... -
Node.js 模块之Nimble流程控制
2016-07-18 12:59 1081NodeJS异步的特性有时候 ... -
Node.js web应用模块之Supervisor
2016-07-18 12:56 2327在开发或调试Node.js应 ...
相关推荐
### 网站常见缓存技术详解 #### 一、全页面静态化缓存 全页面静态化缓存是一种常见的缓存技术,尤其适用于内容管理系统(CMS)中。这种技术的核心在于将动态生成的页面转化为静态HTML文件,从而避免了每次用户访问...
### PHP缓存技术详解 #### 引言 随着互联网技术的迅速发展,用户对网站响应速度的要求越来越高。作为一款流行的Web开发语言,PHP凭借其强大的功能和灵活性在网站建设中占据了重要地位。然而,在处理大量数据时,...
在PHP编程中,缓存技术是一种提升应用程序性能的重要手段,尤其在处理大量数据库查询或计算密集型任务时。本文将详细解析PHP中的缓存技术,包括其原理、优点以及一些实例,以帮助开发者理解如何有效地利用缓存来优化...
PHP缓存技术是提高Web应用程序性能的关键策略,它能够减少数据库查询、降低服务器负载并加快页面加载速度。本文将深入探讨PHP缓存的原理、重要性以及如何利用Redis这一高效缓存工具进行优化。 首先,我们需要理解...
#### 七、PHP 主要缓存技术 1. **Memcache:** - 分布式内存缓存服务,支持多台服务器间的共享缓存。 - 能够高效地处理大量并发请求。 2. **APC (Alternative PHP Cache):** - 是 PHP 的一个扩展,用于实现本地...
在PHP编程中,文件缓存是一种常见的优化技术,它能够减少服务器对数据库的访问,提高网站性能。这个“简单高效php文件缓存类”提供了一种便捷的方式,用于存储和检索经常请求的数据到本地文件系统,从而降低服务器...
缓存技术的核心思想是预先计算或存储一些常用数据,然后在后续请求时直接读取,避免了每次请求都执行复杂的计算或者数据库查询。本文将深入探讨PHP生成缓存文件的原理、方法和最佳实践。 1. 缓存机制简介: 缓存...
在PHP编程中,缓存是一种优化网站性能的重要技术,它能减少服务器的负载,提高页面加载速度,尤其在处理大量数据库查询或者复杂计算时效果显著。本篇文章将深入探讨PHP中的文件缓存类,以及如何利用它来实现高效的...
通过对PHP数据缓存技术的深入分析,我们可以看到缓存在现代Web开发中的重要性。无论是简单的文件缓存还是更复杂的数据库缓存,合理地利用缓存技术都能够显著提升系统的性能和用户体验。未来随着技术的发展,更多的...
在Laravel框架中,Page Cache(页面缓存)是一种优化网站性能的技术,它将动态生成的页面内容存储为静态HTML文件,然后在后续请求时直接返回这些预渲染的页面,从而显著提高页面加载速度。这一功能是通过Laravel的...
在PHP编程中,文件缓存是一种常见的优化技术,它能够减少对数据库的访问频率,提高网站性能。这个“php一个简单的文件缓存类”可能是为了实现这一目标而设计的。下面我们将深入探讨文件缓存的基本原理,以及如何利用...
在PHP编程中,缓存是一种优化技术,用于存储经常访问的数据,以减少对数据库或计算密集型操作的依赖,从而提高应用程序的...合理利用缓存技术,可以显著提高PHP应用的性能,降低服务器负载,为用户提供更快的响应速度。
1. PHP数据缓存概述:在Web开发中,数据缓存是用来减少数据库查询,提高数据处理速度的一种常见技术。PHP数据缓存通常可以分为两种基本类型:文件缓存和内存缓存。文件缓存将数据保存在服务器的文件系统中,适用于读...
PHP 缓存加速器软件种类有很多,常见的有 XCache、eAccelerator、APC (Alternative PHP Cache)、ZendOpcache 等。在企业环境中我们要如何选择 PHP 缓存加速器软件呢?事实上,任选其一即可,没必要都安装上,都安装...
PHP页面缓存方法是针对Web开发中常见性能问题提出的一种优化策略,它可以显著减少数据库查询和服务器处理时间,从而加快页面响应速度。该技术适用于对同一页面内容的访问频率较高,且内容不经常变动的场景。在PHP中...
以下是几种在PHP中常见的缓存技术的详细介绍: 全页面静态化缓存 全页面静态化缓存是一种将整个页面生成静态HTML文件的技术。用户在访问网站时,可以直接读取预先生成的HTML文件,避免了动态内容的服务器处理过程。...