之前我们曾深入的探讨过PHP缓存技术,其中主要提到了数据缓存。数据缓存主要是指数据库查询缓存,每次访问页面的时候,都会先检测相应的缓存数据是否存在,如果不存在,就连接数据库,得到数据, 并把查询结果序列化后保存到文件中,以后同样的查询结果就直接从缓存表或文件中获得。
用的最广的例子看Discuz的搜索功能,把结果ID缓存到一个表中,下次搜索相同关键字时先搜索缓存表。
举个常用的方法,多表关联的时候,把附表中的内容生成数组保存到主表的一个字段中,需要的时候数组分解一下,这样的好处是只读一个表,坏处就是两个 数据同步会多不少步骤,数据库永远是瓶颈,用硬盘换速度,是这个的关键点。
页面缓存
每次访问页面的时候,都会先检测相应的缓存页面文件是否存在,如果不存在,就连接数据库,得到数据,显示页面并同时生成缓存页面文件,这样下次访问 的时候页面文件就发挥作用了。(模板引擎和网上常见的一些缓存类通常有此功能)
时间触发缓存
检查文件是否存在并且时间戳小于设置的过期时间,如果文件修改的时间戳比当前时间戳减去过期时间戳大,那么就用缓存,否则更新缓存。
内容触发缓存
当插入数据或更新数据时,强制更新缓存。
静态缓存
这里所说的静态缓存是指静态化,直接生成HTML或xml等文本文件,有更新的时候重生成一次,适合于不太变化的页面,这就不说了。
内存缓存
Memcached是高性能的,分布式的内存对象缓存系统,用于在动态应用中减少数据库负载,提升访问速度。
<ol class="dp-xml"> <li class="alt"><span><strong><font color="#006699"><span class="tag"></span><span class="tag-name">php</span></font></strong><span> </span></span></li> <li> <span>$</span><span class="attribute"><font color="#ff0000">memcache</font></span><span> = </span><span class="attribute-value"><font color="#0000ff">new</font></span><span> Memcache; </span> </li> <li class="alt"> <span>$memcache-</span><span class="tag"><strong><font color="#006699">></font></strong></span><span>connect(‘localhost’, 11211) or die (“Could not connect”); </span> </li> <li> <span>$</span><span class="attribute"><font color="#ff0000">version</font></span><span> = $memcache-</span><span class="tag"><strong><font color="#006699">></font></strong></span><span>getVersion(); </span> </li> <li class="alt"><span>echo “Server’s version: “.$version.”\n”; </span></li> <li> <span>$</span><span class="attribute"><font color="#ff0000">tmp_object</font></span><span> = </span><span class="attribute-value"><font color="#0000ff">new</font></span><span> stdClass; </span> </li> <li class="alt"> <span>$tmp_object-</span><span class="tag"><strong><font color="#006699">></font></strong></span><span class="attribute"><font color="#ff0000">str_attr</font></span><span> = ‘test’; </span> </li> <li> <span>$tmp_object-</span><span class="tag"><strong><font color="#006699">></font></strong></span><span class="attribute"><font color="#ff0000">int_attr</font></span><span> = </span><span class="attribute-value"><font color="#0000ff">123</font></span><span>; </span> </li> <li class="alt"> <span>$memcache-</span><span class="tag"><strong><font color="#006699">></font></strong></span><span>set(‘key’, $tmp_object, false, 10) or die (“Failed to save data at the server”); </span> </li> <li><span>echo “Store data in the cache (data will expire in 10 seconds)\n”; </span></li> <li class="alt"> <span>$</span><span class="attribute"><font color="#ff0000">get_result</font></span><span> = $memcache-</span><span class="tag"><strong><font color="#006699">></font></strong></span><span>get(‘key’); </span> </li> <li><span>echo “Data from the cache:\n”; </span></li> <li class="alt"><span>var_dump($get_result); </span></li> <li> <span class="tag"><strong><font color="#006699">?></font></strong></span><span> </span> </li> </ol>
读库的例子:
<ol class="dp-xml"> <li class="alt"><span><strong><font color="#006699"><span class="tag"></span><span class="tag-name">php</span></font></strong><span> </span></span></li> <li> <span>$</span><span class="attribute"><font color="#ff0000">sql</font></span><span> = ‘SELECT * FROM users’; </span> </li> <li class="alt"> <span>$</span><span class="attribute"><font color="#ff0000">key</font></span><span> = </span><span class="attribute-value"><font color="#0000ff">md5</font></span><span>($sql); //memcached 对象标识符 </span> </li> <li> <span>if ( !($</span><span class="attribute"><font color="#ff0000">datas</font></span><span> = $mc-</span><span class="tag"><strong><font color="#006699">></font></strong></span><span>get($key)) ) { </span> </li> <li class="alt"><span> </span></li> <li><span>// 在 memcached 中未获取到缓存数据,则使用数据库查询获取记录集 </span></li> <li class="alt"><span> </span></li> <li><span>echo “n”.str_pad(‘Read datas from MySQL.’, 60, ‘_’).”n”; </span></li> <li class="alt"> <span>$</span><span class="attribute"><font color="#ff0000">conn</font></span><span> = </span><span class="attribute-value"><font color="#0000ff">mysql_connect</font></span><span>(‘localhost’, ‘test’, ‘test’); </span> </li> <li><span>mysql_select_db(‘test’); </span></li> <li class="alt"> <span>$</span><span class="attribute"><font color="#ff0000">result</font></span><span> = </span><span class="attribute-value"><font color="#0000ff">mysql_query</font></span><span>($sql); </span> </li> <li> <span>while ($</span><span class="attribute"><font color="#ff0000">row</font></span><span> = </span><span class="attribute-value"><font color="#0000ff">mysql_fetch_object</font></span><span>($result)) </span> </li> <li class="alt"><span>$datas[] = $row; </span></li> <li><span> </span></li> <li class="alt"><span>// 将数据库中获取到的结果集数据保存到 memcached 中,以供下次访问时使用 </span></li> <li><span> </span></li> <li class="alt"> <span>$mc-</span><span class="tag"><strong><font color="#006699">></font></strong></span><span>add($key, $datas); </span> </li> <li><span>} else { </span></li> <li class="alt"><span>echo “n”.str_pad(‘Read datas from memcached.’, 60, ‘_’).”n”; </span></li> <li><span>} </span></li> <li class="alt"><span>var_dump($datas); </span></li> <li> <span class="tag"><strong><font color="#006699">?></font></strong></span><span> </span> </li> </ol>
PHP的缓冲器
比如eaccelerator,apc,phpa,xcache等等。
MySQL缓存
这也算非代码级的,经典的数据库就是用的这种方式,看下面的运行时间,0.09xxx之类的。
<span></span>