找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2178|回复: 1

[教程] PHP企业级应用缓存技术详解

[复制链接]
发表于 2013-3-30 09:55:02 | 显示全部楼层 |阅读模式 来自 中国–广东–湛江
数据缓存主要是指数据库查询缓存,每次访问页面的时候,都会先检测相应的缓存数据是否存在,如果不存在,就连接数据库,得到数据, 并把查询结果序列化后保存到文件中,以后同样的查询结果就直接从缓存表或文件中获得。
          用的最广的例子看Discuz的搜索功能,把结果ID缓存到一个表中,下次搜索相同关键字时先搜索缓存表。
          举个常用的方法,多表关联的时候,把附表中的内容生成数组保存到主表的一个字段中,需要的时候数组分解一下,这样的好处是只读一个表,坏处就是两个 数据同步会多不少步骤,数据库永远是瓶颈,用硬盘换速度,是这个的关键点。
          页面缓存
          每次访问页面的时候,都会先检测相应的缓存页面文件是否存在,如果不存在,就连接数据库,得到数据,显示页面并同时生成缓存页面文件,这样下次访问 的时候页面文件就发挥作用了。(模板引擎和网上常见的一些缓存类通常有此功能)
          时间触发缓存
          检查文件是否存在并且时间戳小于设置的过期时间,如果文件修改的时间戳比当前时间戳减去过期时间戳大,那么就用缓存,否则更新缓存。
          内容触发缓存
          当插入数据或更新数据时,强制更新缓存。
          静态缓存
          这里所说的静态缓存是指静态化,直接生成HTML或xml等文本文件,有更新的时候重生成一次,适合于不太变化的页面,这就不说了。
          内存缓存
          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."";
  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)";
  11.   $get_result = $memcache->get('key');
  12.   echo "Data from the cache:";
  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等等。
          MySQL缓存
          这也算非代码级的,经典的数据库就是用的这种方式,看下面的运行时间,0.09xxx之类的。
         
        
  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.   
  168.   proxy_redirect off;
  169.   proxy_set_header Host $host;
  170.   proxy_set_header X-Real-IP $remote_addr;
  171.   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  172.   client_max_body_size 10m;
  173.   client_body_buffer_size 128k;
  174.   proxy_connect_timeout 90;
  175.   proxy_send_timeout 90;
  176.   proxy_read_timeout 90;
  177.   proxy_buffer_size 4k;
  178.   proxy_buffers 4 32k;
  179.   proxy_busy_buffers_size 64k;
  180.   proxy_temp_file_write_size 64k;
复制代码

          mod_proxy的例子:
         
        
  1. <VirtualHost *>
  2.   ServerName www.zxsv.com
  3.   ServerAdmin admin@zxsv.com
  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 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/dev_access_log combined
  22.   </VirtualHost>
复制代码

发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;

如何回报帮助你解决问题的坛友,好办法就是点击帖子下方的评分按钮给对方加【金币】不会扣除自己的积分,做一个热心并受欢迎的人!

发表于 2013-3-31 17:20:41 | 显示全部楼层 来自 中国–山西–阳泉
好高深啊,不错挺好的

评分

参与人数 1金币 +5 收起 理由
抢楼评分专号 + 5 很幸运,你获得了抢楼奖励!

查看全部评分

发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;

如何回报帮助你解决问题的坛友,好办法就是点击帖子下方的评分按钮给对方加【金币】不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则 需要先绑定手机号

关闭

站长推荐上一条 /1 下一条

QQ|侵权投诉|广告报价|手机版|小黑屋|西部数码代理|飘仙建站论坛 ( 豫ICP备2022021143号-1 )

GMT+8, 2024-11-29 02:25 , Processed in 0.050930 second(s), 13 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表