解析PHP企业级应用缓存技术

网络整理 - 07-28

本文主要解析PHP企业级应用缓存技术,从基本的PHP缓存概念到技术代码的实现都深入做了解读。数据缓存:这里所说的数据缓存是指数据库查询缓存。

普遍缓存技术

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

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

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

  页面缓存:

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

  时间触发缓存:

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

  内容触发缓存:

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

  静态缓存:

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

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

  内存缓存:

  Memcached是高性能的,分布式的内存对象缓存系统,用于在动态应用中减少数据库负载,提升访问速度。

  这里说下Memcached的例子:

1.<?php
2.$memcache=new Memcache;
3. (“Could not connect”);
4.$version=$memcache->getVersion();
5.”\n”;
6.$tmp_object=new stdClass;
7. ‘test’;
8.123;
9.$tmp_object,false, (“Failed to save data at the server”);
10. seconds)\n”;
11.$get_result=’);
12.\n”;
13.);
14.?>

  读库的例子:

1.<?php
2.$sql= ‘SELECT * FROM users’;
3.$key=4.=)) ) {
5.6.”n”;
7.$conn= ‘test’);
8.mysql_select_db(‘test’);
9.$result=);
10.=))
11.$row;
12.13.$datas);
{
15.”n”;
16. }
17.);
18.?>

  PHP的缓冲器:

  有eaccelerator, apc, PHPa,xcache,这个这个就不说了吧,搜索一堆一堆的,自己看啦,知道有这玩意就OK

  MYSQL缓存:

  这也算非代码级的,经典的数据库就是用的这种方式,看下面的运行时间,0.09xxx之类的。

  我贴段根据蓝色那家伙修改后部分my.ini 吧,2G的MYISAM表可以在0.05S左右,据说他前后改了有快一年

1. [client]
2. ……
3.gbk
4.MYISAM




64M
10. ……

12. ……
100G
100G
128M
1024M
512M
18. ……

  基于反向代理的Web缓存:

  如Nginx,SQUID,mod_PRoxy(apache2以上又分为mod_proxy和mod_cache)

  NGINX的例子

1.
2.;
4. crit;
pid;
;
7. events {
8.use epoll;
;
10. }
11. http {
12.types;
stream;
14. sendfile on;
;
16. tcp_nodelay on;
17.18. upstream bspfrontsvr {
;
;
21. }
22.
23. upstream bspimgsvr {
;
25. }
26.
27. upstream bspstylesvr {
;
29. }
30.
31. upstream bsphelpsvr {
;
33. }
34.
35. upstream bspwsisvr {
;
37. }
38.
39. upstream bspadminsvr {
;
41. }
42.
43. upstream bspbuyersvr {
;
45. }
46.
47. upstream bspsellersvr {
;
49. }
50. upstream bsploginsvr {
;
52. }
53. upstream bspregistersvr {
;
55. }
” ‘
” ‘;
58.59.60. server {
;
com;
{
65.conf;
66. }
67. access_log logs test_com;
68. }
69.
70.71. server {
;
com;
{
76.conf;
77. }
test_com;
79. }
80.
81.82. server {
;
com;
{
87.conf;
88. }
test_com;
90. }
91.
92.93. server {
;
com;
{
98.conf;
99. }
test_com;
101. }
102.
103.104. server {
;
com;
{
109.conf;
110. }
test_com;
112. }
113.
114.115. server {
;
com;
{
120.conf;
121. }
test_com;
123. }
124.125. server {
;
com;
{
130.conf;
131. }
test_com;
133. }
134.135. server {
;
com;
{
139. stub_status on;
140. access_log off;
141. }
{
144.conf;
145. }
test_com;
502503504html;
html {
149. root html;
150. }
151. }
152.153. server {
;
com;
156. ssl on;
pem;
;
159. ssl_session_timeout 5m;
160. ssl_protocols SSLv2 SSLv3 TLSv1;
;
162. ssl_prefer_server_ciphers on;
{
165.conf;
166. }
test_com;
168. }
169.170. server {
;
com;
{
175.conf;
176. }
test_com;
178. }
179.
180. }
181.
182. proxy_redirect off;
;
;
$proxy_add_x_forwarded_for;
186. client_max_body_size 10m;
187. client_body_buffer_size 128k;
;
;
;
191. proxy_buffer_size 4k;
32k;
193. proxy_busy_buffers_size 64k;
194. proxy_temp_file_write_size 64k;
195. mod_proxy的例子:
196.
197.
com
com
200.203.proxy”
205.
207.
209.
211.
213.
215.
dev_access_log combined
218.

  而SQUID的例子我就不说明了,这方面网上有写的太多,大家自己搜索一下

  DNS轮询:

  BIND是一款开放源码的DNS服务器软件,这个要说起来就大了,自己搜索去,大家知道有这个东西就行了。

  我知道的有chinacache 等大站就是这样做的,说简单点就是多服务器啦,把同一个页面或文件缓存到不同的服务器上,按南北自动解析到相关的服务器中。