PHP企业级应用之常见缓存技术深入解读

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

普遍缓存技术

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

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

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

页面缓存:

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

时间触发缓存:

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

内容触发缓存:

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

静态缓存:

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

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

内存缓存:

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

这里说下Memcached的例子:

  1. <?php  
  2. $memcache = new Memcache;  
  3. $memcache->connect(‘localhost’, 11211) or die (“Could not connect”);  
  4. $version = $memcache->getVersion();  
  5. echo “Server’s version: “.$version.”\n”;  
  6. $tmp_object = new stdClass;  
  7. $tmp_object->str_attr = ‘test’;  
  8. $tmp_object->int_attr = 123;  
  9. $memcache->set(‘key’, $tmp_object, false, 10) or die (“Failed to save data at the server”);  
  10. echo “Store data in the cache (data will expire in 10 seconds)\n”;  
  11. $get_result = $memcache->get(‘key’);  
  12. echo “Data from the cache:\n”;  
  13. var_dump($get_result);  
  14. ?> 

读库的例子:

  1. <?php  
  2. $sql = ‘SELECT * FROM users’;  
  3. $key = md5($sql);   //memcached 对象标识符  
  4. if ( !($datas = $mc->get($key)) ) {  
  5. //  在 memcached 中未获取到缓存数据,则使用数据库查询获取记录集。  
  6. echo “n”.str_pad(‘Read datas from MySQL.’, 60, ‘_’).”n”;  
  7. $conn = mysql_connect(‘localhost’, ‘test’, ‘test’);  
  8. mysql_select_db(‘test’);  
  9. $result = mysql_query($sql);  
  10. while ($row = mysql_fetch_object($result))  
  11. $datas[] = $row;  
  12. //  将数据库中获取到的结果集数据保存到 memcached 中,以供下次访问时使用。  
  13. $mc->add($key$datas);  
  14. else {  
  15. echo “n”.str_pad(‘Read datas from memcached.’, 60, ‘_’).”n”;  
  16. }  
  17. var_dump($datas);  
  18. ?> 

PHP的缓冲器:

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

MYSQL缓存:

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

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

  1. [client]  
  2. ……  
  3. default-character-set=gbk  
  4. default-storage-engine=MYISAM  
  5. max_connections=600  
  6. max_connect_errors=500  
  7. back_log=200  
  8. interactive_timeout=7200  
  9. query_cache_size=64M  
  10. ……  
  11. table_cache=512  
  12. ……  
  13. myisam_max_sort_file_size=100G  
  14. myisam_max_extra_sort_file_size=100G  
  15. myisam_sort_buffer_size=128M  
  16. key_buffer_size=1024M  
  17. read_buffer_size=512M  
  18. ……  
  19. thread_concurrency=8 

基于反向代理的Web缓存:

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

NGINX的例子

  1. <nginx.conf>  
  2. #user  nobody;  
  3. worker_processes  4;  
  4. error_log  logs/error.log crit;  
  5. pid        logs/nginx.pid;  
  6. worker_rlimit_nofile 10240;  
  7. events {  
  8. use epoll;  
  9. worker_connections  51200;  
  10. }  
  11. http {  
  12. include       mime.types;  
  13. default_type  application/octet-stream;  
  14. sendfile    on;  
  15. keepalive_timeout 65;  
  16. tcp_nodelay on;  
  17. # server pool  
  18. upstream bspfrontsvr {  
  19. server 10.10.10.224:80   weight=1;  
  20. server 10.10.10.221:80   weight=1;  
  21. }  
  22.  
  23. upstream bspimgsvr {  
  24. server 10.10.10.201:80   weight=1;  
  25. }  
  26.  
  27. upstream bspstylesvr {  
  28. server 10.10.10.202:80   weight=1;  
  29. }  
  30.  
  31. upstream bsphelpsvr {  
  32. server 10.10.10.204:80   weight=1;  
  33. }  
  34.  
  35. upstream bspwsisvr {  
  36. server 10.10.10.203:80   weight=1;  
  37. }  
  38.  
  39. upstream bspadminsvr {  
  40. server 10.10.10.222:80   weight=1;  
  41. }  
  42.  
  43. upstream bspbuyersvr {  
  44. server 10.10.10.223:80   weight=1;  
  45. }  
  46.  
  47. upstream bspsellersvr {  
  48. server 10.10.10.225:80   weight=1;  
  49. }  
  50. upstream  bsploginsvr  {  
  51. server 10.10.10.220:443  weight=1;  
  52. }  
  53. upstream  bspregistersvr  {  
  54. server 10.10.10.220:80  weight=1;  
  55. }  
  56. log_format  test_com  ‘$remote_addr – $remote_user [$time_local] “$request” ‘  
  57. $status $body_bytes_sent “$http_referer” “$http_user_agent” ‘;  
  58. #——————————————————————–  
  59. #img.test.com  
  60. server {  
  61. listen       10.10.10.230:80;  
  62. server_name  img.test.com;  
  63. location / {  
  64. proxy_pass      http://bspimgsvr;  
  65. include         proxy_setting.conf;  
  66. }  
  67. access_log  logs/img.log  test_com;  
  68. }  
  69.  
  70. #style.test.com  
  71. server {  
  72. listen       10.10.10.230:80;  
  73. server_name  style.test.com;  
  74. location / {  
  75. proxy_pass      http://bspstylesvr;  
  76. include         proxy_setting.conf;  
  77. }  
  78. access_log  logs/style.log  test_com;  
  79. }  
  80.  
  81. #help.test.com  
  82. server {  
  83. listen       10.10.10.230:80;  
  84. server_name  help.test.com;  
  85. location / {  
  86. proxy_pass      http://bsphelpsvr;  
  87. include         proxy_setting.conf;  
  88. }  
  89. access_log  logs/help.log  test_com;  
  90. }  
  91.  
  92. #admin.test.com  
  93. server {  
  94. listen       10.10.10.230:80;  
  95. server_name  admin.test.com;  
  96. location / {  
  97. proxy_pass      http://bspadminsvr;  
  98. include         proxy_setting.conf;  
  99. }  
  100. access_log  logs/admin.log  test_com;  
  101. }  
  102.  
  103. #buyer.test.com  
  104. server {  
  105. listen       10.10.10.230:80;  
  106. server_name  buyer.test.com;  
  107. location / {  
  108. proxy_pass      http://bspbuyersvr;  
  109. include         proxy_setting.conf;  
  110. }  
  111. access_log  logs/buyer.log  test_com;  
  112. }  
  113.  
  114. #seller.test.com  
  115. server {  
  116. listen       10.10.10.230:80;  
  117. server_name  seller.test.com;  
  118. location / {  
  119. proxy_pass      http://bspsellersvr;  
  120. include         proxy_setting.conf;  
  121. }  
  122. access_log  logs/seller.log  test_com;  
  123. }  
  124. #wsi.test.com  
  125. server {  
  126. listen       10.10.10.230:80;  
  127. server_name  wsi.test.com;  
  128. location / {  
  129. proxy_pass      http://bspwsisvr;  
  130. include         proxy_setting.conf;  
  131. }  
  132. access_log  logs/wsi.log  test_com;  
  133. }  
  134. #www.test.com  
  135. server {  
  136. listen       10.10.10.230:80;  
  137. server_name  www.test.com   *.test.com;  
  138. location ~ ^/NginxStatus/ {  
  139. stub_status on;  
  140. access_log off;  
  141. }  
  142. location / {  
  143. proxy_pass      http://bspfrontsvr;  
  144. include         proxy_setting.conf;  
  145. }  
  146. access_log  logs/www.log  test_com;  
  147. error_page   500 502 503 504  /50x.html;  
  148. location = /50x.html {  
  149. root   html;  
  150. }  
  151. }  
  152. #login.test.com  
  153. server {  
  154. listen       10.10.10.230:443;  
  155. server_name  login.test.com;  
  156. ssl                  on;  
  157. ssl_certificate      cert.pem;  
  158. ssl_certificate_key  cert.key;  
  159. ssl_session_timeout  5m;  
  160. ssl_protocols  SSLv2 SSLv3 TLSv1;  
  161. ssl_ciphers  ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;  
  162. ssl_prefer_server_ciphers   on;  
  163. location / {  
  164. proxy_pass        https://bsploginsvr;  
  165. include         proxy_setting.conf;  
  166. }  
  167. access_log  logs/login.log  test_com;  
  168. }  
  169. #login.test.com for register  
  170. server {  
  171. listen       10.10.10.230:80;  
  172. server_name  login.test.com;  
  173. location / {  
  174. proxy_pass        http://bspregistersvr;  
  175. include         proxy_setting.conf;  
  176. }  
  177. access_log  logs/register.log  test_com;  
  178. }  
  179.  
  180. }  
  181. <conf/proxy_setting.conf>  
  182. proxy_redirect          off;  
  183. proxy_set_header        Host $host;  
  184. proxy_set_header        X-Real-IP $remote_addr;  
  185. proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;  
  186. client_max_body_size    10m;  
  187. client_body_buffer_size 128k;  
  188. proxy_connect_timeout   90;  
  189. proxy_send_timeout      90;  
  190. proxy_read_timeout      90;  
  191. proxy_buffer_size       4k;  
  192. proxy_buffers           4 32k;  
  193. proxy_busy_buffers_size 64k;  
  194. proxy_temp_file_write_size 64k;  
  195. mod_proxy的例子:  
  196.  
  197. <VirtualHost *>  
  198. ServerName www.zxsv.com  
  199. ServerAdmin admin@zxsv.com  
  200. # reverse proxy setting  
  201. ProxyPass / http://www.zxsv.com:8080/  
  202. ProxyPassReverse / http://www.zxsv.com:8080/  
  203. # cache dir root  
  204. CacheRoot “/var/www/proxy”  
  205. # max cache storage  
  206. CacheSize 50000000  
  207. # hour: every 4 hour  
  208. CacheGcInterval 4  
  209. # max page expire time: hour  
  210. CacheMaxExpire 240  
  211. # Expire time = (now – last_modified) * CacheLastModifiedFactor  
  212. CacheLastModifiedFactor 0.1  
  213. # defalt expire tag: hour  
  214. CacheDefaultExpire 1  
  215. # force complete after precent of content retrived: 60-90%  
  216. CacheForceCompletion 80  
  217. CustomLog /usr/local/apache/logs/dev_access_log combined  
  218. </VirtualHost> 

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

DNS轮询:

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

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

原文链接:http://www.cnblogs.com/cnblogs20112011/archive/2011/01/27/1946286.html

【编辑推荐】

  1. 使用 PHP 集成 Google Spreadsheets 数据
  2. PHP与Java在Web开发方面的比较
  3. PHP中发现奇异Bug 导致Web服务器崩溃
  4. Web开发者必备:21个超实用PHP代码
  5. 40个迹象表明你还是PHP菜鸟
责任编辑:陈贻新 来源: 博客园
相关推荐

2010-10-19 08:59:40

PHP缓存技术

2009-12-08 16:48:25

PHP类phpExce

2012-06-14 13:26:22

2010-07-21 09:38:15

PHP缓存技术

2012-09-05 17:29:32

存储系统华为

2011-12-12 19:40:59

邦诺存储

2010-01-04 16:38:07

企业级Silverli

2021-10-11 14:28:25

TypeScript企业级应用

2010-08-11 10:16:24

FlexRIA

2012-12-18 17:11:58

2009-12-29 15:33:18

微软企业级策略鲍宏图IT与业务

2011-12-01 15:29:07

2012-05-14 09:29:40

云应用

2013-04-26 15:13:26

Ted YuHBase大数据全球技术峰会

2012-05-15 15:21:29

企业级

2015-05-26 09:41:45

china-pub

2009-01-03 14:54:36

ibmdwWebSphere

2009-06-03 14:24:12

ibmdwWebSphere

2009-12-14 20:13:57

IBM

2013-07-02 13:53:48

App企业级应用
点赞
收藏

51CTO技术栈公众号