首页  >  文章  >  后端开发  >  细说PHP下的缓存技术

细说PHP下的缓存技术

WBOY
WBOY原创
2016-07-25 09:11:47847浏览

常用缓存技术

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

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

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

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

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

内容触发缓存: 当插入数据或更新数据时,强制更新缓存。

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

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

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

这里说下Memcached的例子:

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

读库的例子:

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

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. #user nobody;
  2. worker_processes 4;
  3. error_log logs/error.log crit;
  4. pid logs/nginx.pid;
  5. worker_rlimit_nofile 10240;
  6. events {
  7. use epoll;
  8. worker_connections 51200;
  9. }
  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. }
  21. upstream bspimgsvr {

  22. server 10.10.10.201:80 weight=1;
  23. }
  24. upstream bspstylesvr {

  25. server 10.10.10.202:80 weight=1;
  26. }
  27. upstream bsphelpsvr {

  28. server 10.10.10.204:80 weight=1;
  29. }
  30. upstream bspwsisvr {

  31. server 10.10.10.203:80 weight=1;
  32. }
  33. upstream bspadminsvr {

  34. server 10.10.10.222:80 weight=1;
  35. }
  36. upstream bspbuyersvr {

  37. server 10.10.10.223:80 weight=1;
  38. }
  39. upstream bspsellersvr {

  40. server 10.10.10.225:80 weight=1;
  41. }
  42. upstream bsploginsvr {
  43. server 10.10.10.220:443 weight=1;
  44. }
  45. upstream bspregistersvr {
  46. server 10.10.10.220:80 weight=1;
  47. }
  48. log_format test_com '$remote_addr - $remote_user [$time_local] "$request" '
  49. '$status $body_bytes_sent "$http_referer" "$http_user_agent" ';
  50. #--------------------------------------------------------------------
  51. #img.test.com
  52. server {
  53. listen 10.10.10.230:80;
  54. server_name img.test.com;
  55. location / {
  56. proxy_pass http://bspimgsvr;
  57. include proxy_setting.conf;
  58. }
  59. access_log logs/img.log test_com;
  60. }
  61. #style.test.com

  62. server {
  63. listen 10.10.10.230:80;
  64. server_name style.test.com;
  65. location / {
  66. proxy_pass http://bspstylesvr;
  67. include proxy_setting.conf;
  68. }
  69. access_log logs/style.log test_com;
  70. }
  71. #help.test.com

  72. server {
  73. listen 10.10.10.230:80;
  74. server_name help.test.com;
  75. location / {
  76. proxy_pass http://bsphelpsvr;
  77. include proxy_setting.conf;
  78. }
  79. access_log logs/help.log test_com;
  80. }
  81. #admin.test.com

  82. server {
  83. listen 10.10.10.230:80;
  84. server_name admin.test.com;
  85. location / {
  86. proxy_pass http://bspadminsvr;
  87. include proxy_setting.conf;
  88. }
  89. access_log logs/admin.log test_com;
  90. }
  91. #buyer.test.com

  92. server {
  93. listen 10.10.10.230:80;
  94. server_name buyer.test.com;
  95. location / {
  96. proxy_pass http://bspbuyersvr;
  97. include proxy_setting.conf;
  98. }
  99. access_log logs/buyer.log test_com;
  100. }
  101. #seller.test.com

  102. server {
  103. listen 10.10.10.230:80;
  104. server_name seller.test.com;
  105. location / {
  106. proxy_pass http://bspsellersvr;
  107. include proxy_setting.conf;
  108. }
  109. access_log logs/seller.log test_com;
  110. }
  111. #wsi.test.com
  112. server {
  113. listen 10.10.10.230:80;
  114. server_name wsi.test.com;
  115. location / {
  116. proxy_pass http://bspwsisvr;
  117. include proxy_setting.conf;
  118. }
  119. access_log logs/wsi.log test_com;
  120. }
  121. #www.test.com
  122. server {
  123. listen 10.10.10.230:80;
  124. server_name www.test.com *.test.com;
  125. location ~ ^/NginxStatus/ {
  126. stub_status on;
  127. access_log off;
  128. }
  129. location / {
  130. proxy_pass http://bspfrontsvr;
  131. include proxy_setting.conf;
  132. }
  133. access_log logs/www.log test_com;
  134. error_page 500 502 503 504 /50x.html;
  135. location = /50x.html {
  136. root html;
  137. }
  138. }
  139. #login.test.com
  140. server {
  141. listen 10.10.10.230:443;
  142. server_name login.test.com;
  143. ssl on;
  144. ssl_certificate cert.pem;
  145. ssl_certificate_key cert.key;
  146. ssl_session_timeout 5m;
  147. ssl_protocols SSLv2 SSLv3 TLSv1;
  148. ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
  149. ssl_prefer_server_ciphers on;
  150. location / {
  151. proxy_pass https://bsploginsvr;
  152. include proxy_setting.conf;
  153. }
  154. access_log logs/login.log test_com;
  155. }
  156. #login.test.com for register
  157. server {
  158. listen 10.10.10.230:80;
  159. server_name login.test.com;
  160. location / {
  161. proxy_pass http://bspregistersvr;
  162. include proxy_setting.conf;
  163. }
  164. access_log logs/register.log test_com;
  165. }
  166. }

  167. proxy_redirect off;
  168. proxy_set_header Host $host;
  169. proxy_set_header X-Real-IP $remote_addr;
  170. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  171. client_max_body_size 10m;
  172. client_body_buffer_size 128k;
  173. proxy_connect_timeout 90;
  174. proxy_send_timeout 90;
  175. proxy_read_timeout 90;
  176. proxy_buffer_size 4k;
  177. proxy_buffers 4 32k;
  178. proxy_busy_buffers_size 64k;
  179. proxy_temp_file_write_size 64k;
复制代码

mod_proxy的例子:

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

而有关SQUID的例子 ,可以参考下这里。

DNS轮询: BIND是一款开放源码的DNS服务器软件,这个要说起来就大了,自己搜索去,大家知道有这个东西就行了。 我知道的有chinacache等大站就是这样做的,说简单点就是多服务器啦,把同一个页面或文件缓存到不同的服务器上,按南北自动解析到相关的服务器中。



声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn