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. 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. <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.     } 
  21.     
  22.     upstream bspimgsvr { 
  23.             server 10.10.10.201:80   weight=1; 
  24.     } 
  25.     
  26.     upstream bspstylesvr { 
  27.             server 10.10.10.202:80   weight=1; 
  28.     } 
  29.     
  30.     upstream bsphelpsvr { 
  31.             server 10.10.10.204:80   weight=1; 
  32.     } 
  33.     
  34.     upstream bspwsisvr { 
  35.             server 10.10.10.203:80   weight=1; 
  36.     } 
  37.     
  38.     upstream bspadminsvr { 
  39.             server 10.10.10.222:80   weight=1; 
  40.     } 
  41.     
  42.     upstream bspbuyersvr { 
  43.             server 10.10.10.223:80   weight=1; 
  44.     } 
  45.     
  46.     upstream bspsellersvr { 
  47.             server 10.10.10.225:80   weight=1; 
  48.     } 
  49.     upstream  bsploginsvr  { 
  50.             server 10.10.10.220:443  weight=1; 
  51.     } 
  52.     upstream  bspregistersvr  { 
  53.             server 10.10.10.220:80  weight=1; 
  54.     } 
  55.     log_format  test_com  '$remote_addr - $remote_user [$time_local] "$request" ' 
  56.                              '$status $body_bytes_sent "$http_referer" "$http_user_agent" '
  57.     #-------------------------------------------------------------------- 
  58.     #img.test.com 
  59.     server { 
  60.         listen       10.10.10.230:80; 
  61.         server_name  img.test.com; 
  62.         location / { 
  63.                         proxy_pass      http://bspimgsvr; 
  64.                         include         proxy_setting.conf; 
  65.         } 
  66.         access_log  logs/img.log  test_com; 
  67.     } 
  68.     
  69.     #style.test.com 
  70.     server { 
  71.         listen       10.10.10.230:80; 
  72.         server_name  style.test.com; 
  73.         location / { 
  74.                         proxy_pass      http://bspstylesvr; 
  75.                         include         proxy_setting.conf; 
  76.         } 
  77.         access_log  logs/style.log  test_com; 
  78.     } 
  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.     
  93.     #admin.test.com 
  94.     server { 
  95.         listen       10.10.10.230:80; 
  96.         server_name  admin.test.com; 
  97.         location / { 
  98.                         proxy_pass      http://bspadminsvr; 
  99.                         include         proxy_setting.conf; 
  100.         } 
  101.         access_log  logs/admin.log  test_com; 
  102.     } 
  103.     
  104.     #buyer.test.com 
  105.     server { 
  106.         listen       10.10.10.230:80; 
  107.         server_name  buyer.test.com; 
  108.         location / { 
  109.                         proxy_pass      http://bspbuyersvr; 
  110.                         include         proxy_setting.conf; 
  111.         } 
  112.         access_log  logs/buyer.log  test_com; 
  113.     } 
  114.     
  115.     #seller.test.com 
  116.     server { 
  117.         listen       10.10.10.230:80; 
  118.         server_name  seller.test.com; 
  119.         location / { 
  120.                         proxy_pass      http://bspsellersvr; 
  121.                         include         proxy_setting.conf; 
  122.         } 
  123.         access_log  logs/seller.log  test_com; 
  124.     } 
  125.     #wsi.test.com 
  126.     server { 
  127.         listen       10.10.10.230:80; 
  128.         server_name  wsi.test.com; 
  129.         location / { 
  130.                         proxy_pass      http://bspwsisvr; 
  131.                         include         proxy_setting.conf; 
  132.         } 
  133.         access_log  logs/wsi.log  test_com; 
  134.     } 
  135.     #www.test.com 
  136.     server { 
  137.         listen       10.10.10.230:80; 
  138.         server_name  www.test.com   *.test.com; 
  139.         location ~ ^/NginxStatus/ { 
  140.             stub_status on
  141.             access_log off
  142.         } 
  143.         location / { 
  144.                         proxy_pass      http://bspfrontsvr; 
  145.                         include         proxy_setting.conf; 
  146.         } 
  147.         access_log  logs/www.log  test_com; 
  148.         error_page   500 502 503 504  /50x.html; 
  149.         location = /50x.html { 
  150.             root   html; 
  151.         } 
  152.     }   
  153.     #login.test.com 
  154.     server { 
  155.         listen       10.10.10.230:443; 
  156.         server_name  login.test.com; 
  157.         ssl                  on
  158.         ssl_certificate      cert.pem; 
  159.         ssl_certificate_key  cert.key
  160.         ssl_session_timeout  5m; 
  161.         ssl_protocols  SSLv2 SSLv3 TLSv1; 
  162.         ssl_ciphers  ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP; 
  163.         ssl_prefer_server_ciphers   on
  164.         location / { 
  165.                         proxy_pass        https://bsploginsvr; 
  166.                         include         proxy_setting.conf; 
  167.         } 
  168.         access_log  logs/login.log  test_com; 
  169.     } 
  170.     #login.test.com for register 
  171.     server { 
  172.         listen       10.10.10.230:80; 
  173.         server_name  login.test.com; 
  174.         location / { 
  175.                         proxy_pass        http://bspregistersvr; 
  176.                         include         proxy_setting.conf; 
  177.         }    
  178.         access_log  logs/register.log  test_com; 
  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; 

 

mod_proxy的例子:

 

  
  
  
  
  1. <VirtualHost *> 
  2. ServerName www.zxsv.com 
  3. ServerAdmin [email protected] 
  4. # reverse proxy setting 
  5. ProxyPass / http://www.zxsv.com:8080/ 
  6. ProxyPassReverse / http://www.zxsv.com: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 timehour 
  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/dev_access_log combined 
  22. </VirtualHost> 

而SQUID的例子 ,这方面网上有写的太多,大家自己搜索一下

DNS轮询

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

你可能感兴趣的:(缓存技术,php缓存)