当前位置:首页 > PHP教程 > php高级应用 > 列表

PHP常用的缓存技术汇总

发布:smiling 来源: PHP粉丝网  添加日期:2020-11-30 16:41:44 浏览: 评论:0 

这篇文章主要介绍了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); 

读库的例子:

  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. var_dump($datas); 

七、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. http { 
  11. include mime.types; 
  12. default_type application/octet-stream; 
  13. sendfile on; 
  14. keepalive_timeout 65; 
  15. tcp_nodelay on; 
  16. # server pool 
  17. upstream bspfrontsvr { 
  18. server 10.10.10.224:80 weight=1; 
  19. server 10.10.10.221:80 weight=1; 
  20. upstream bspimgsvr { 
  21. server 10.10.10.201:80 weight=1; 
  22. upstream bspstylesvr { 
  23. server 10.10.10.202:80 weight=1; 
  24. upstream bsphelpsvr { 
  25. server 10.10.10.204:80 weight=1; 
  26. upstream bspwsisvr { 
  27. server 10.10.10.203:80 weight=1; 
  28. upstream bspadminsvr { 
  29. server 10.10.10.222:80 weight=1; 
  30. upstream bspbuyersvr { 
  31. server 10.10.10.223:80 weight=1; 
  32. upstream bspsellersvr { 
  33. server 10.10.10.225:80 weight=1; 
  34. upstream bsploginsvr { 
  35. server 10.10.10.220:443 weight=1; 
  36. upstream bspregistersvr { 
  37. server 10.10.10.220:80 weight=1; 
  38. log_format test_com '$remote_addr - $remote_user [$time_local] "$request" ' 
  39. '$status $body_bytes_sent "$http_referer" "$http_user_agent" '
  40. #-------------------------------------------------------------------- 
  41. #img.test.com 
  42. server { 
  43. listen 10.10.10.230:80; 
  44. server_name img.test.com; 
  45. location / { 
  46. proxy_pass http://bspimgsvr; 
  47. include proxy_setting.conf; 
  48. access_log logs/img.log test_com; 
  49. #style.test.com 
  50. server { 
  51. listen 10.10.10.230:80; 
  52. server_name style.test.com; 
  53. location / { 
  54. proxy_pass http://bspstylesvr; 
  55. include proxy_setting.conf; 
  56. access_log logs/style.log test_com; 
  57. #help.test.com 
  58. server { 
  59. listen 10.10.10.230:80; 
  60. server_name help.test.com; 
  61. location / { 
  62. proxy_pass http://bsphelpsvr; 
  63. include proxy_setting.conf; 
  64. access_log logs/help.log test_com; 
  65. #admin.test.com 
  66. server { 
  67. listen 10.10.10.230:80; 
  68. server_name admin.test.com; 
  69. location / { 
  70. proxy_pass http://bspadminsvr; 
  71. include proxy_setting.conf; 
  72. access_log logs/admin.log test_com; 
  73. #buyer.test.com 
  74. server { 
  75. listen 10.10.10.230:80; 
  76. server_name buyer.test.com; 
  77. location / { 
  78. proxy_pass http://bspbuyersvr; 
  79. include proxy_setting.conf; 
  80. access_log logs/buyer.log test_com; 
  81. #seller.test.com 
  82. server { 
  83. listen 10.10.10.230:80; 
  84. server_name seller.test.com; 
  85. location / { 
  86. proxy_pass http://bspsellersvr; 
  87. include proxy_setting.conf; 
  88. access_log logs/seller.log test_com; 
  89. #wsi.test.com 
  90. server { 
  91. listen 10.10.10.230:80; 
  92. server_name wsi.test.com; 
  93. location / { 
  94. proxy_pass http://bspwsisvr; 
  95. include proxy_setting.conf; 
  96. access_log logs/wsi.log test_com; 
  97. #www.test.com 
  98. server { 
  99. listen 10.10.10.230:80; 
  100. server_name www.test.com *.test.com; 
  101. location ~ ^/NginxStatus/ { 
  102. stub_status on; 
  103. access_log off; 
  104. location / { 
  105. proxy_pass http://bspfrontsvr; 
  106. include proxy_setting.conf; 
  107. access_log logs/www.log test_com; 
  108. error_page 500 502 503 504 /50x.html; 
  109. location = /50x.html { 
  110. root html; 
  111. #login.test.com 
  112. server { 
  113. listen 10.10.10.230:443; 
  114. server_name login.test.com; 
  115. ssl on; 
  116. ssl_certificate cert.pem; 
  117. ssl_certificate_key cert.key; 
  118. ssl_session_timeout 5m; 
  119. ssl_protocols SSLv2 SSLv3 TLSv1; 
  120. ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP
  121. ssl_prefer_server_ciphers on; 
  122. location / { 
  123. proxy_pass https://bsploginsvr; 
  124. include proxy_setting.conf; 
  125. access_log logs/login.log test_com; 
  126. #login.test.com for register 
  127. server { 
  128. listen 10.10.10.230:80; 
  129. server_name login.test.com; 
  130. location / { 
  131. proxy_pass http://bspregistersvr; 
  132. include proxy_setting.conf; 
  133. access_log logs/register.log test_com; 
  134. <conf/proxy_setting.conf> 
  135. proxy_redirect off; 
  136. proxy_set_header Host $host
  137. proxy_set_header X-Real-IP $remote_addr
  138. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for
  139. client_max_body_size 10m; 
  140. client_body_buffer_size 128k; 
  141. proxy_connect_timeout 90; 
  142. proxy_send_timeout 90; 
  143. proxy_read_timeout 90; 
  144. proxy_buffer_size 4k; 
  145. proxy_buffers 4 32k; 
  146. proxy_busy_buffers_size 64k; 
  147. proxy_temp_file_write_size 64k; 

apache mod_proxy的例子:

  1. <VirtualHost *> 
  2. ServerName jb51.net 
  3. ServerAdmin admin@zxsv.com 
  4. # reverse proxy setting 
  5. ProxyPass / http://jb51.net:8080/ 
  6. ProxyPassReverse / http://jb51.net:8080/ 
  7. # cache dir root 
  8. CacheRoot "/var/www/proxy" 
  9. # max cache storage 
  10. CacheSize 50000000 
  11. # hour: every 4 hour 
  12. CacheGcInterval 4 
  13. # max page expire time: hour 
  14. CacheMaxExpire 240 
  15. # Expire time = (now - last_modified) * CacheLastModifiedFactor 
  16. CacheLastModifiedFactor 0.1 
  17. # defalt expire tag: hour 
  18. CacheDefaultExpire 1 
  19. # force complete after precent of content retrived: 60-90% 
  20. CacheForceCompletion 80 
  21. CustomLog /usr/local/apache/logs/jb51_net_access_log combined 
  22. </VirtualHost> 

十、DNS轮询

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

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

Tags: PHP缓存技术

分享到: