关于PHP的缓存
2011年05月12日
关于PHP的缓存0. 为什么要缓存为什么需要缓存,缓存的目的就是加速页面的载入,因此使用缓存之后,你的请求将会直接去获取html文件,传统的动态页面从数据库中获取数据,然后用程序 将数据显示出来的这个过程就被绕过去了,而这个过程是最消耗系统资源的过程,静态页面传送过程中,系统I/O所占用的资源相比之下就可以忽略了。当然,更 传统的其实还是静态页面,因为它出现在动态页面之前。有人说用缓存更新不及时,不够快,所以很不方便,这也是很有道理的,但是仅仅是因为这样就放弃使用缓存,或许不太划算,特别是在你服务器压力比较大的情况下。
1. 什么是缓存顾名思义,缓存是一块设定了缓冲功能的内存区域,用于提供数据的高速缓冲。无论是针对硬件的CPU的缓存,硬盘的缓存。都是起到减少不比要的I/O访问,提高数据访问速度的目的。
2. 缓存的形式字面上,缓存就应该是内存的一个部分。但是,也有其他形式的缓存。
CPU上的缓存可以有2到3级RAM,是现在CPU设计中一个重要的组成部分。同样,硬盘上的Flash RAM芯片,承担了缓存的作用。
而针对应用软件系统,例如:Memcached这样的软件,从物理内存中划去了一部分空间,为各种应用程序提供缓存服务。
针对特殊的Web + DB的这种B/S业务系统,还有类似的生成静态页,减少数据库存取I/O操作的缓存方式。
3. PHP缓存的具体方法针对PHP这种具体的B/S架构的脚本语言,有几种常见的缓存形式。
文件缓存:文件缓存是PHP缓存的十分常见的一种形式。其主要目的是将页面中不经常变更的数据保存在文件中,当有用户请求访问的时候,直接将数据调出,避免了再次对数据库的请求的I/O操作,减少了数据库的负载压力。
一般情况下,PHP的文件缓存分为两种方法:
第一种,把需要缓存的数据进行处理,形成PHP可以直接执行的文件。在需要缓存数据的时候,通过include方式引入,并使用。
第二种,把需要的数据通过serialize函数序列化后直接保存到文件。在需要使用缓存数据的时候,通过反序列化读入文件内容并复制给需要的变量,然后使用。当然,这里说到的serialize函数是PHP自带的serialize()函数。针对该函数的改进问题,后续的章节将会提及。
通过测试发现,第二种也就是serialize缓存数据的方式更加高效。
分析原因:
include方式读取缓存的时候,PHP需要执行几个过程
1.读取文件
2.解析所Include的文件
3.执行,给变量赋值
而serialize序列化方式读取缓存的时候:
1.读取数据
2.反序列化数据内容
3.给变量赋值
从以上内容对比的话,可能是由于解析PHP文件内的数组需要的时间超过unserialize反序列化数组的时间。
测试代码:
CacheTest_IncludeFile.php
view source
print?01 0,
04 'values' =>
05 array (
06 0 =>
07 array (
08 'id' => '3',
09 'title' => 'Title NO.3',
10 'dateline' => '1191244506',
11 ),
12 1 =>
13 array (
14 'id' => '2',
15 'title' => 'Title NO.2',
16 'dateline' => '1191244505',
17 ),
18 2 =>
19 array (
20 'id' => '1',
21 'title' => 'Title NO.1',
22 'dateline' => '1191244504',
23 ),
24 ),
25 'multipage' => NULL,
26 );
CacheTest_SerializeFile.php
view source
print?01内存缓存之后,第一种通过include读取缓存的方式速度会高于第二种serialize序列化缓存的方式。
本部分参考: http://www.ccvita.com/311.html
Sqlite缓存:Sqlite是嵌入式SQL数据库引擎SQLite(SQLite Embeddable SQL Database Engine)的一个扩展。SQLite是一个实现嵌入式SQL数据库引擎小型C语言库(C library),实现了独立的,可嵌入的,零配置的SQL数据库引擎。特性包括:事务操作是原子,一致,孤立,并且持久的,即使在系统崩溃和电源故障之后。零配置――不需要安装和管理。实现了绝大多数SQL92标准。整个数据库存储在一个单一的文件中。数据库文件可以在不同字节序的机器之间自由地共享。支持 最大可达2T的数据库。字符串和BLOB类型的大小只受限于可用内存。完整配置的少于250KB,忽略一些可选特性的少于150KB。在大多数常见操作上 比流行的客户/服务器数据库引擎更快。简单易于使用的API。内建TCL绑定。另外提供可用于许多其他语言的绑定。具有良好注释的源代码,代码95%有较好的注释。独立:没有外部依赖。源代码位于公共域,可用于任何用途。用 SQLite连接的程序可以使用SQL数据库,但不需要运行一个单独的关系型数据库管理系统进程(separate RDBMS process)。SQLite不是一个用于连接到大型数据库服务器(big database server)的客户端库(client library),而是非常适合桌面程序和小型网站的数据库服务器。SQLite直接读写(reads and writes directly)在硬盘上的数据库文件。著名的浏览器Firefox的数据库就采用的Sqlite。Firefox所记录的配置,书签,历史记录,Cookie和Password等信息,均存储在Sqlite中。
在缓存方案中,选择采用Sqlite作为方案,主要是看中了它轻量,简单,快速的特点。并且,PHP5以上版本就内部支持了Sqlite的操作,使用起来简单,方便。因此,作为PHP和MySQL中间的一个有效的缓冲机制,Sqlite无意是一个很好的选择。由于Sqlite的缓存方案不是本文探讨的重点。因此,这里就做上述的简单介绍。
Apc缓存:APC,严格的意义上讲应该成为加速器,全称Alternative PHP Cache,是 PHP 的一个免费公开的优化代码缓存。它用来提供免费,公开并且强健的架构来缓存和优化 PHP 的中间代码。对应的还有eAccelerator 和 Zend Optimizer两个加速器方案。
APC提供两种缓存功能,即缓存Opcode(目标文件),我们称之为apc_compiler_cache。同时它还提供一些接口用于PHP开发人员将用户数据驻留在内存中,我们称之为apc_user_cache。我们这里主要控讨php-apc的配置。
安装PHP APC:
作为测试环境,我们这里使用的是CentOS5.4(2.6.18-194.3.1.el5) + Apache2.2.3 + php5.2.10.我们可以去pecl apc下载APC-3.0.19.tgz
view source
print?1# tar -xzvf APC-3.0.19.tgz
2#cd APC-3.0.19
3# /usr/bin/phpize
4# ./configure --enable-apc --enable-mmap --enable-apc-spinlocks --disable-apc-pthreadmutex
5#make
6#make install
注意:我们这里支持mmap,同时采用spinlocks自旋锁。Spinlocks是Facebook推荐使用,同时也是APC开发者推荐使用的锁机制。
APC PHP.ini配置选项详解
view source
print?001[APC]
002; Alternative PHP Cache 用于缓存和优化PHP中间代码
003
004apc.cache_by_default = On
005;SYS
006; 是否默认对所有文件启用缓冲。
007; 若设为Off并与以加号开头的apc.filters指令一起用,则文件仅在匹配过滤器时才被缓存。
008
009apc.enable_cli = Off
010;SYS
011; 是否为CLI版本启用APC功能,仅用于测试和调试目的才打开此指令。
012
013apc.enabled = On
014; 是否启用APC,如果APC被静态编译进PHP又想禁用它,这是唯一的办法。
015
016apc.file_update_protection = 2
017;SYS
018; 当你在一个运行中的服务器上修改文件时,你应当执行原子操作。
019; 也就是先写进一个临时文件,然后将该文件重命名(mv)到最终的名字。
020; 文本编辑器以及 cp, tar 等程序却并不是这样操作的,从而导致有可能缓冲了残缺的文件。
021; 默认值 2 表示在访问文件时如果发现修改时间距离访问时间小于 2 秒则不做缓冲。
022; 那个不幸的访问者可能得到残缺的内容,但是这种坏影响却不会通过缓存扩大化。
023; 如果你能确保所有的更新操作都是原子操作,那么可以用 0 关闭此特性。
024; 如果你的系统由于大量的IO操作导致更新缓慢,你就需要增大此值。
025
026apc.filters =
027;SYS
028; 一个以逗号分隔的POSIX扩展正则表达式列表。
029; 如果源文件名与任意一个模式匹配,则该文件不被缓存。
030; 注意,用来匹配的文件名是传递给include/require的文件名,而不是绝对路径。
031; 如果正则表达式的第一个字符是"+"则意味着任何匹配表达式的文件会被缓存,
032; 如果第一个字符是"-"则任何匹配项都不会被缓存。"-"是默认值,可以省略掉。
033
034apc.ttl = 0
035;SYS
036; 缓存条目在缓冲区中允许逗留的秒数。0 表示永不超时。建议值为7200~36000。
037; 设为 0 意味着缓冲区有可能被旧的缓存条目填满,从而导致无法缓存新条目。
038
039apc.user_ttl = 0
040;SYS
041; 类似于apc.ttl,只是针对每个用户而言,建议值为7200~36000。
042; 设为 0 意味着缓冲区有可能被旧的缓存条目填满,从而导致无法缓存新条目。
043
044apc.gc_ttl = 3600
045;SYS
046; 缓存条目在垃圾回收表中能够存在的秒数。
047; 此值提供了一个安全措施,即使一个服务器进程在执行缓存的源文件时崩溃,
048; 而且该源文件已经被修改,为旧版本分配的内存也不会被回收,直到达到此TTL值为止。
049; 设为零将禁用此特性。
050
051apc.include_once_override = Off
052;SYS
053; 关于该指令目前尚无说明文档,参见:http://pecl.php.net/bugs/bug.php?id=8754
054; 请保持为Off,否则可能导致意想不到的结果。
055
056apc.max_file_size = 1M
057;SYS
058; 禁止大于此尺寸的文件被缓存。
059
060apc.mmap_file_mask =
061;SYS
062; 如果使用
发表评论
-
关于如何学好游戏3D引擎编程的一些经验
2012-01-20 02:49 587关于如何学好游戏3D引擎编程的一些经验 2010年09月16 ... -
3d世界尽在掌握!―― directx 8.1/9 graphic 全解析
2012-01-20 02:49 6053d世界尽在掌握!―― directx 8.1/9 graph ... -
使用D3D渲染YUV视频数据
2012-01-20 02:49 1409使用D3D渲染YUV视频数据 ... -
关于 OGRE 与 OSG 的简单比较
2012-01-20 02:49 761关于 OGRE 与 OSG 的简单 ... -
在vxworks下进行OpenGL编程的环境搭建
2012-01-20 02:49 1421在vxworks下进行OpenGL编程的环境搭建 2010年 ... -
神马都是浮云,但也要用心去活!
2012-01-19 10:42 632神马都是浮云,但也要用心去活! 2012年01月11日 ... -
神马爱上了浮云。
2012-01-19 10:42 541神马爱上了浮云。 2012 ... -
神马都是浮云
2012-01-19 10:42 426神马都是浮云 2012年01月14日 ... -
神马爱情?全是浮云
2012-01-19 10:42 542神马爱情?全是浮云 2011年12月24日 神马爱情、你 ... -
成绩神马的是浮云对不对
2012-01-19 10:42 544成绩神马的是浮云对不对 2012年01月13日 今天是1 ... -
并行 .net 应用程序的过去、现在和未来
2012-01-17 03:12 550并行 .net 应用程序的过去、现在和未来 2011年08月 ... -
Linux设备驱动程序设计(17.2)(完)
2012-01-17 03:12 550Linux设备驱动程序设计(17.2)(完) 2010年06 ... -
linux驱动开发1
2012-01-17 03:12 806linux驱动开发1 2011年06 ... -
冲刺的感觉
2012-01-16 01:46 550冲刺的感觉 2009年11月02日 ... -
复制千万业绩
2012-01-16 01:46 466复制千万业绩 2011年04月30日 ... -
团队激励语、职场标语、行动口号激励语
2012-01-16 01:46 1045团队激励语、职场标语、行动口号激励语 2010年08月08日 ... -
激励口号!
2012-01-16 01:46 620激励口号! 2009年12月27 ... -
团队口号_激励口号
2012-01-16 01:45 616团队口号_激励口号 2011 ... -
最近任务不是很近整理了一下这一个月来我学习的新技术-如果可以的话、我愿意-iteye技术网站
2012-01-11 01:36 659最近任务不是很近整理了一下这一个月来我学习的新技术-如果可以的 ... -
hibernate使用xml配置文件的方式-如果可以的话、我愿意-iteye技术网站
2012-01-11 01:35 631hibernate使用xml配置文件的方式-如果可以的话、我愿 ...
相关推荐
PHP 缓存PHP 缓存PHP 缓存PHP 缓存 PHP 缓存
php变量缓存到文件的函数 SAVE函数有用哦。php变量缓存到文件的函数 SAVE函数有用哦。php变量缓存到文件的函数 SAVE函数有用哦。php变量缓存到文件的函数 SAVE函数有用哦。php变量缓存到文件的函数 SAVE函数有用哦。...
个简单至极的PHP缓存类代码,缓存的应用对于php项目的开发来说尤为重要 使用说明: 1、实例化 $cache = new Cache(); 2、设置缓存时间和缓存目录 $cache = new Cache(60, '/any_other_path/'); 第一个参数是缓存...
php缓存技术总结,全静态,部分缓存,数据缓存,查询缓存,内存式缓存,APC缓存,Opcode缓存
* 缓存抽象类 */ abstract class Cache_Abstract { /** * 读缓存变量 * * @param string $key 缓存下标 * @return mixed */ abstract public function fetch($key); /** * 缓存变量 * * @...
一个php缓存多级目录的类 参数详解如下: 第一个参数:缓存二级目录 第二个参数:缓存时间 默认1800 第三个参数:是否需要三级目录 0:不需要 1 需要 默认0 第四个参数:缓存后缀 默认 .html 调用方法: $...
PHP禁止缓存如何禁止页面缓存,?php //设置此页面的过期时间(用格林威治时间表示),只要是已经过去的日期即可。 header("Expires: Mon, 26 Jul 1970 05:00:00 GMT"); //设置此页面的最后更新日期(用格林威治...
php缓存实现原理,静态模版技术,关于ob系列函数,
PHP查询缓存
在实际的应用中,用户使用浏览器浏览Web应用,都是在向Web...而大部分用户的请求都很类似,因需要将PHP脚本执行的结果进行缓存或将其放到静态的HTML文件中。这样,用户在访问时就直接访问静态HTML网页,不执行PHP脚本。
php缓存学习,php缓存相关文档.pdf格式
数据文件缓存的做法我们常用的有php文件缓存与利用memcache来缓存数据,下面面我分别总结了memcache缓存数据与数据文件缓存有需要的朋友可参考. 1.对于一般的变量,把该变量变成php语言的格式,写到文件中,用时...
PHP 做APP后台缓存原理,仅是第一步PHP的缓存原理,请勿下载!
php运行时缓存. 借鉴自WordPress
在php中缓存分类数据库缓存,文件缓存和内存缓存,下面是一个给各位朋友详细介绍PHP文件缓存类实现代码,有需要了解的朋友可参考。
php缓存生成html类 ob_start() ...
PHP文件缓存的主要功能页面,主要是根据一个键值直接计算出文件目录,从而减少查找文件的时间。
详解php缓存技术 缓存在php中的用法详解
一个PHP缓存类,设置详细内容见代码里面,此版本为utf-8编码,如果网站采用其它编码请自行转换,Windows系统用记事本打开另存为,选择相应编码即可(一般ANSI),Linux下请使用相应编辑软件或iconv命令行。动态缓存和静态...
php生成缓存文件 php生成缓存文件 php生成缓存文件 php生成缓存文件