/ 水滴石穿 / PHP缓存技术

PHP缓存技术

2012-04-05 posted in [php]

#简介

PHP缓存包括PHP编译缓存和PHP数据缓存两种。PHP是一种解释型语言,属于边编译边运行的那种。这种运行模式的有点是程序修改方便,但是运行效率却很低下。PHP编译缓存针对这种情况进行处理,使得PHP语言只要运行一次,就可以把程序的编译结果缓存起来。这样,接下来的每次运行都不需要再次编译了,这大大提高了PHP运行速度。PHP数据缓存运用于PHP实际开发之中针对数据处理进行缓存,主要两大方向:针对数据库数据进行缓存和针对PHP模板数据进行缓存。

#PHP编译缓存

目前常见的PHP编译缓存工具有:APC、Accelerator、xcache等。

PHP是一种解释型语言,在PHP语言执行代码的时候,需要下面两步:

  1. 编译过程。PHP读取文件,并编译该文件,然后生成能够在zend engine上执行的中间码。

  2. 执行过程。PHP直接执行中间码。

以下两种情况,会导致PHP运行程序代码效率低下:

  1. 即使PHP代码文件没有发生改变,也会被重新编译。

  2. 如有引用文件,PHP也要花费时间重新编译这些被引用的文件。

因此,需要PHP编译缓存工具对PHP程序编译结果做缓存处理。这样,PHP程序只要编译一次,就不要重新再做无意义的编译了。

#PHP数据缓存

PHP的数据缓存包括对数据库数据的缓存和针对PHP模板数据的缓存。针对数据库数据进行缓存的工具有memcache等。针对模板数据的缓存工具主要有smarty等。

#PHP缓存类型

数据缓存:这里所说的数据缓存是指数据库查询PHP缓存机制,每次访问页面的时候,都会先检测相应的缓存数据是否存在,如果不存在,就连接数据库,得到数据,并把查询结果序列化后保存到文件中,以后同样的查询结果就直接从缓存表或文件中获得。

用的最广的例子看Discuz的搜索功能,把结果ID缓存到一个表中,下次搜索相同关键字时先搜索缓存表。

举个常用的方法,多表关联的时候,把附表中的内容生成数组保存到主表的一个字段中,需要的时候数组分解一下,这样的好处是只读一个表,坏处就是两个数据同步会多不少步骤,数据库永远是瓶颈,用硬盘换速度,是这个的关键点。

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

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

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

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