登录  /  注册

PHP企业级应用缓存技术详解

巴扎黑
发布: 2016-11-23 15:36:09
原创
1137人浏览过

之前我们曾深入的探讨过php缓存技术,其中主要提到了数据缓存。数据缓存主要是指数据库查询缓存,每次访问页面的时候,都会先检测相应的缓存数据是否存在,如果不存在,就连接数据库,得到数据, 并把查询结...     




  之前我们曾深入的探讨过php缓存技术,其中主要提到了数据缓存。数据缓存主要是指数据库查询缓存,每次访问页面的时候,都会先检测相应的缓存数据是否存在,如果不存在,就连接数据库,得到数据, 并把查询结果序列化后保存到文件中,以后同样的查询结果就直接从缓存表或文件中获得。 

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

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

  页面缓存 

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

  时间触发缓存 

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

  内容触发缓存 

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

  静态缓存 

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

  内存缓存 

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



    $memcache = new memcache; 

  $memcache->connect(‘localhost’, 11211) or die (“could not connect”); 

  $version = $memcache->getversion(); 

  echo “server’s version: “.$version.”\n”; 

  $tmp_object = new stdclass; 

  $tmp_object->str_attr = ‘test’; 

  $tmp_object->int_attr = 123; 

  $memcache->set(‘key’, $tmp_object, false, 10) or die (“failed to save data at the server”); 

  echo “store data in the cache (data will expire in 10 seconds)\n”; 

  $get_result = $memcache->get(‘key’); 

  echo “data from the cache:\n”; 

  var_dump($get_result); 

  ?> 



  读库的例子: 



    $sql = ‘select * from users’; 

  $key = md5($sql); //memcached 对象标识符 

  if ( !($datas = $mc->get($key)) ) { 

  // 在 memcached 中未获取到缓存数据,则使用数据库查询获取记录集 

  echo “n”.str_pad(‘read datas from mysql.’, 60, ‘_’).”n”; 

  $conn = mysql_connect(‘localhost’, ‘test’, ‘test’); 

  mysql_select_db(‘test’); 

  $result = mysql_query($sql); 

  while ($row = mysql_fetch_object($result)) 

  $datas[] = $row; 

  // 将数据库中获取到的结果集数据保存到 memcached 中,以供下次访问时使用 

  $mc->add($key, $datas); 

  } else { 

  echo “n”.str_pad(‘read datas from memcached.’, 60, ‘_’).”n”; 

  } 

  var_dump($datas); 

  ?> 



  php的缓冲器 

  比如eaccelerator,apc,phpa,xcache等等。 

  mysql缓存 

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



  [client] 

  …… 

  default-character-set=gbk 

  default-storage-engine=myisam 

  max_connections=600 

  max_connect_errors=500 

  back_log=200 

  interactive_timeout=7200 

  query_cache_size=64m 

  …… 

  table_cache=512 

  …… 

  myisam_max_sort_file_size=100g 

  myisam_max_extra_sort_file_size=100g 

  myisam_sort_buffer_size=128m 

  key_buffer_size=1024m 

  read_buffer_size=512m 

  …… 

  thread_concurrency=8 



  基于反向代理的web缓存 

  如nginx,squid,mod_proxy(apache2以上又分为mod_proxy和mod_cache) 

  nginx的例子: 



  #user nobody; 

  worker_processes 4; 

  error_log logs/error.log crit; 

  pid logs/nginx.pid; 

  worker_rlimit_nofile 10240; 

  events { 

  use epoll; 

  worker_connections 51200; 

  } 

  http { 

  include mime.types; 

  default_type application/octet-stream; 

  sendfile on; 

  keepalive_timeout 65; 

  tcp_nodelay on; 

  # server pool 

  upstream bspfrontsvr { 

  server 10.10.10.224:80 weight=1; 

  server 10.10.10.221:80 weight=1; 

  } 

  upstream bspimgsvr { 

  server 10.10.10.201:80 weight=1; 

  } 

  upstream bspstylesvr { 

  server 10.10.10.202:80 weight=1; 

  } 

  upstream bsphelpsvr { 

  server 10.10.10.204:80 weight=1; 

  } 

  upstream bspwsisvr { 

  server 10.10.10.203:80 weight=1; 

  } 

  upstream bspadminsvr { 

  server 10.10.10.222:80 weight=1; 

  } 

  upstream bspbuyersvr { 

  server 10.10.10.223:80 weight=1; 

  } 

  upstream bspsellersvr { 

  server 10.10.10.225:80 weight=1; 

  } 

  upstream bsploginsvr { 

  server 10.10.10.220:443 weight=1; 

  } 

  upstream bspregistersvr { 

  server 10.10.10.220:80 weight=1; 

  } 

  log_format test_com ‘$remote_addr – $remote_user [$time_local] “$request” ‘ 

  ‘$status $body_bytes_sent “$http_referer” “$http_user_agent” ‘; 

  #——————————————————————– 

  #img.test.com 

  server { 

  listen 10.10.10.230:80; 

  server_name img.test.com; 

  location / { 

  proxy_pass http://bspimgsvr; 

  include proxy_setting.conf; 

  } 

  access_log logs/img.log test_com; 

  } 

  #style.test.com 

  server { 

  listen 10.10.10.230:80; 

  server_name style.test.com; 

  location / { 

  proxy_pass http://bspstylesvr; 

  include proxy_setting.conf; 

  } 

  access_log logs/style.log test_com; 

  } 

  #help.test.com 

  server { 

  listen 10.10.10.230:80; 

  server_name help.test.com; 

  location / { 

  proxy_pass http://bsphelpsvr; 

  include proxy_setting.conf; 

  } 

  access_log logs/help.log test_com; 

  } 

  #admin.test.com 

  server { 

  listen 10.10.10.230:80; 

  server_name admin.test.com; 

  location / { 

  proxy_pass http://bspadminsvr; 

  include proxy_setting.conf; 

  } 

  access_log logs/admin.log test_com; 

  } 

  #buyer.test.com 

  server { 

  listen 10.10.10.230:80; 

  server_name buyer.test.com; 

  location / { 

  proxy_pass http://bspbuyersvr; 

  include proxy_setting.conf; 

  } 

  access_log logs/buyer.log test_com; 

  } 



  #seller.test.com 

  server { 

  listen 10.10.10.230:80; 

  server_name seller.test.com; 

  location / { 

  proxy_pass http://bspsellersvr; 

  include proxy_setting.conf; 

  } 

  access_log logs/seller.log test_com; 

  } 

  #wsi.test.com 

  server { 

  listen 10.10.10.230:80; 

  server_name wsi.test.com; 

  location / { 

  proxy_pass http://bspwsisvr; 

  include proxy_setting.conf; 

  } 

  access_log logs/wsi.log test_com; 

  } 

  #www.test.com 

  server { 

  listen 10.10.10.230:80; 

  server_name www.test.com *.test.com; 

  location ~ ^/nginxstatus/ { 

  stub_status on; 

  access_log off; 

  } 

  location / { 

  proxy_pass http://bspfrontsvr; 

  include proxy_setting.conf; 

  } 

  access_log logs/www.log test_com; 

  error_page 500 502 503 504 /50x.html; 

  location = /50x.html { 

  root html; 

  } 

  } 

  #login.test.com 

  server { 

  listen 10.10.10.230:443; 

  server_name login.test.com; 

  ssl on; 

  ssl_certificate cert.pem; 

  ssl_certificate_key cert.key; 

  ssl_session_timeout 5m; 

  ssl_protocols sslv2 sslv3 tlsv1; 

  ssl_ciphers all:!adh:!export56:rc4+rsa:+high:+medium:+low:+sslv2:+exp; 

  ssl_prefer_server_ciphers on; 

  location / { 

  proxy_pass https://bsploginsvr; 

  include proxy_setting.conf; 

  } 

  access_log logs/login.log test_com; 

  } 

  #login.test.com for register 

  server { 

  listen 10.10.10.230:80; 

  server_name login.test.com; 

  location / { 

  proxy_pass http://bspregistersvr; 

  include proxy_setting.conf; 

  } 

  access_log logs/register.log test_com; 

  } 

  } 

   

  proxy_redirect off; 

  proxy_set_header host $host; 

  proxy_set_header x-real-ip $remote_addr; 

  proxy_set_header x-forwarded-for $proxy_add_x_forwarded_for; 

  client_max_body_size 10m; 

  client_body_buffer_size 128k; 

  proxy_connect_timeout 90; 

  proxy_send_timeout 90; 

  proxy_read_timeout 90; 

  proxy_buffer_size 4k; 

  proxy_buffers 4 32k; 

  proxy_busy_buffers_size 64k; 

  proxy_temp_file_write_size 64k; 



  mod_proxy的例子: 



   

  servername www.zxsv.com 

  serveradmin admin@zxsv.com 

  # reverse proxy setting 

  proxypass / http://www.zxsv.com:8080/ 

  proxypassreverse / http://www.zxsv.com:8080/ 

  # cache dir root 

  cacheroot “/var/www/proxy” 

  # max cache storage 

  cachesize 50000000 

  # hour: every 4 hour 

  cachegcinterval 4 

  # max page expire time: hour 

  cachemaxexpire 240 

  # expire time = (now – last_modified) * cachelastmodifiedfactor 

  cachelastmodifiedfactor 0.1 

  # defalt expire tag: hour 

  cachedefaultexpire 1 

  # force complete after precent of content retrived: 60-90% 

  cacheforcecompletion 80 

  customlog /usr/local/apache/logs/dev_access_log combined 

  

智能AI问答
PHP中文网智能助手能迅速回答你的编程问题,提供实时的代码和解决方案,帮助你解决各种难题。不仅如此,它还能提供编程资源和学习指导,帮助你快速提升编程技能。无论你是初学者还是专业人士,AI智能助手都能成为你的可靠助手,助力你在编程领域取得更大的成就。
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
关于CSS思维导图的课件在哪? 课件
凡人来自于2024-04-16 10:10:18
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2024 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号