Discuz教程网

PHP企业级应用之常见缓存技术篇

[复制链接]
authicon dly 发表于 2011-9-1 21:02:13 | 显示全部楼层 |阅读模式
普遍缓存技术
数据缓存:这里所说的数据缓存是指数据库查询缓存,每次访问页面的时候,都会先检测相应的缓存数据是否存在,如果不存在,就连接数据库,得到数据, 并把查询结果序列化后保存到文件中,以后同样的查询结果就直接从缓存表或文件中获得。
用的最广的例子看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. }
  17. var_dump($datas);
  18. ?>
复制代码




php的缓冲器:
有eaccelerator, apc, phpa,xcache,这个这个就不说了吧,搜索一堆一堆的,自己看啦,知道有这玩意就OK
MYSQL缓存:
这也算非代码级的,经典的数据库就是用的这种方式,看下面的运行时间,0.09xxx之类的
我贴段根据蓝色那家伙修改后部分my.ini 吧,2G的MYISAM表可以在0.05S左右,据说他前后改了有快一年
[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的例子

代码如下:


  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. }
  11. http {
  12. include mime.types;
  13. default_type application/octet-stream;
  14. sendfile on;
  15. keepalive_timeout 65;
  16. tcp_nodelay on;
  17. # server pool
  18. upstream bspfrontsvr {
  19. server 10.10.10.224:80 weight=1;
  20. server 10.10.10.221:80 weight=1;
  21. }
  22. upstream bspimgsvr {
  23. server 10.10.10.201:80 weight=1;
  24. }
  25. upstream bspstylesvr {
  26. server 10.10.10.202:80 weight=1;
  27. }
  28. upstream bsphelpsvr {
  29. server 10.10.10.204:80 weight=1;
  30. }
  31. upstream bspwsisvr {
  32. server 10.10.10.203:80 weight=1;
  33. }
  34. upstream bspadminsvr {
  35. server 10.10.10.222:80 weight=1;
  36. }
  37. upstream bspbuyersvr {
  38. server 10.10.10.223:80 weight=1;
  39. }
  40. upstream bspsellersvr {
  41. server 10.10.10.225:80 weight=1;
  42. }
  43. upstream bsploginsvr {
  44. server 10.10.10.220:443 weight=1;
  45. }
  46. upstream bspregistersvr {
  47. server 10.10.10.220:80 weight=1;
  48. }
  49. log_format test_com ‘$remote_addr – $remote_user [$time_local] “$request” ‘
  50. ‘$status $body_bytes_sent “$http_referer” “$http_user_agent” ‘;
  51. #——————————————————————–
  52. #img.test.com
  53. server {
  54. listen 10.10.10.230:80;
  55. server_name img.test.com;
  56. location / {
  57. proxy_pass http://bspimgsvr;
  58. include proxy_setting.conf;
  59. }
  60. access_log logs/img.log test_com;
  61. }
  62. #style.test.com
  63. server {
  64. listen 10.10.10.230:80;
  65. server_name style.test.com;
  66. location / {
  67. proxy_pass http://bspstylesvr;
  68. include proxy_setting.conf;
  69. }
  70. access_log logs/style.log test_com;
  71. }
  72. #help.test.com
  73. server {
  74. listen 10.10.10.230:80;
  75. server_name help.test.com;
  76. location / {
  77. proxy_pass http://bsphelpsvr;
  78. include proxy_setting.conf;
  79. }
  80. access_log logs/help.log test_com;
  81. }
  82. #admin.test.com
  83. server {
  84. listen 10.10.10.230:80;
  85. server_name admin.test.com;
  86. location / {
  87. proxy_pass http://bspadminsvr;
  88. include proxy_setting.conf;
  89. }
  90. access_log logs/admin.log test_com;
  91. }
  92. #buyer.test.com
  93. server {
  94. listen 10.10.10.230:80;
  95. server_name buyer.test.com;
  96. location / {
  97. proxy_pass http://bspbuyersvr;
  98. include proxy_setting.conf;
  99. }
  100. access_log logs/buyer.log test_com;
  101. }
  102. #seller.test.com
  103. server {
  104. listen 10.10.10.230:80;
  105. server_name seller.test.com;
  106. location / {
  107. proxy_pass http://bspsellersvr;
  108. include proxy_setting.conf;
  109. }
  110. access_log logs/seller.log test_com;
  111. }
  112. #wsi.test.com
  113. server {
  114. listen 10.10.10.230:80;
  115. server_name wsi.test.com;
  116. location / {
  117. proxy_pass http://bspwsisvr;
  118. include proxy_setting.conf;
  119. }
  120. access_log logs/wsi.log test_com;
  121. }
  122. #www.test.com
  123. server {
  124. listen 10.10.10.230:80;
  125. server_name www.test.com *.test.com;
  126. location ~ ^/NginxStatus/ {
  127. stub_status on;
  128. access_log off;
  129. }
  130. location / {
  131. proxy_pass http://bspfrontsvr;
  132. include proxy_setting.conf;
  133. }
  134. access_log logs/www.log test_com;
  135. error_page 500 502 503 504 /50x.html;
  136. location = /50x.html {
  137. root html;
  138. }
  139. }
  140. #login.test.com
  141. server {
  142. listen 10.10.10.230:443;
  143. server_name login.test.com;
  144. ssl on;
  145. ssl_certificate cert.pem;
  146. ssl_certificate_key cert.key;
  147. ssl_session_timeout 5m;
  148. ssl_protocols SSLv2 SSLv3 TLSv1;
  149. ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
  150. ssl_prefer_server_ciphers on;
  151. location / {
  152. proxy_pass https://bsploginsvr;
  153. include proxy_setting.conf;
  154. }
  155. access_log logs/login.log test_com;
  156. }
  157. #login.test.com for register
  158. server {
  159. listen 10.10.10.230:80;
  160. server_name login.test.com;
  161. location / {
  162. proxy_pass http://bspregistersvr;
  163. include proxy_setting.conf;
  164. }
  165. access_log logs/register.log test_com;
  166. }
  167. }
  168. <conf/proxy_setting.conf>
  169. proxy_redirect off;
  170. proxy_set_header Host $host;
  171. proxy_set_header X-Real-IP $remote_addr;
  172. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  173. client_max_body_size 10m;
  174. client_body_buffer_size 128k;
  175. proxy_connect_timeout 90;
  176. proxy_send_timeout 90;
  177. proxy_read_timeout 90;
  178. proxy_buffer_size 4k;
  179. proxy_buffers 4 32k;
  180. proxy_busy_buffers_size 64k;
  181. proxy_temp_file_write_size 64k;
  182. mod_proxy的例子:
  183. <VirtualHost *>
  184. ServerName www.zxsv.com
  185. ServerAdmin admin@zxsv.com
  186. # reverse proxy setting
  187. ProxyPass / http://www.zxsv.com:8080/
  188. ProxyPassReverse / http://www.zxsv.com:8080/
  189. # cache dir root
  190. CacheRoot “/var/www/proxy”
  191. # max cache storage
  192. CacheSize 50000000
  193. # hour: every 4 hour
  194. CacheGcInterval 4
  195. # max page expire time: hour
  196. CacheMaxExpire 240
  197. # Expire time = (now – last_modified) * CacheLastModifiedFactor
  198. CacheLastModifiedFactor 0.1
  199. # defalt expire tag: hour
  200. CacheDefaultExpire 1
  201. # force complete after precent of content retrived: 60-90%
  202. CacheForceCompletion 80
  203. CustomLog /usr/local/apache/logs/dev_access_log combined
  204. </VirtualHost>
复制代码



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




上一篇:PHP学习笔记之二 PHP入门知识
下一篇:PHP中MVC模式的模板引擎开发经验分享
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1314学习网 ( 浙ICP备10214163号 )

GMT+8, 2025-5-3 13:32

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

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