当前位置:  开发笔记 > 编程语言 > 正文

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

好的程序不光是代码写的好,整体架构很重要,当然,其中涉及的因素有很多。本文将给大家介绍一些PHP在企业级应用中常用的缓存技术,包括数据缓存、页面缓存等等。">

 

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

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

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

页面缓存

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

时间触发缓存

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

内容触发缓存

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

静态缓存

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

内存缓存

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


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

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. 		 
  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.  
  23. upstream bspimgsvr {  
  24. server 10.10.10.201:80   weight=1;  
  25. }  
  26.  
  27. upstream bspstylesvr {  
  28. server 10.10.10.202:80   weight=1;  
  29. }  
  30.  
  31. upstream bsphelpsvr {  
  32. server 10.10.10.204:80   weight=1;  
  33. }  
  34.  
  35. upstream bspwsisvr {  
  36. server 10.10.10.203:80   weight=1;  
  37. }  
  38.  
  39. upstream bspadminsvr {  
  40. server 10.10.10.222:80   weight=1;  
  41. }  
  42.  
  43. upstream bspbuyersvr {  
  44. server 10.10.10.223:80   weight=1;  
  45. }  
  46.  
  47. upstream bspsellersvr {  
  48. server 10.10.10.225:80   weight=1;  
  49. }  
  50. upstream  bsploginsvr  {  
  51. server 10.10.10.220:443  weight=1;  
  52. }  
  53. upstream  bspregistersvr  {  
  54. server 10.10.10.220:80  weight=1;  
  55. }  
  56. log_format  test_com  ‘$remote_addr – $remote_user [$time_local] “$request” ‘  
  57. ‘$status $body_bytes_sent “$http_referer” “$http_user_agent” ‘;  
  58. #——————————————————————–  
  59. #img.test.com  
  60. server {  
  61. listen       10.10.10.230:80;  
  62. server_name  img.test.com;  
  63. location / {  
  64. proxy_pass      http://bspimgsvr;  
  65. include         proxy_setting.conf;  
  66. }  
  67. access_log  logs/img.log  test_com;  
  68. }  
  69.  
  70. #style.test.com  
  71. server {  
  72. listen       10.10.10.230:80;  
  73. server_name  style.test.com;  
  74. location / {  
  75. proxy_pass      http://bspstylesvr;  
  76. include         proxy_setting.conf;  
  77. }  
  78. access_log  logs/style.log  test_com;  
  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. #admin.test.com  
  93. server {  
  94. listen       10.10.10.230:80;  
  95. server_name  admin.test.com;  
  96. location / {  
  97. proxy_pass      http://bspadminsvr;  
  98. include         proxy_setting.conf;  
  99. }  
  100. access_log  logs/admin.log  test_com;  
  101. }  
  102.  
  103. #buyer.test.com  
  104. server {  
  105. listen       10.10.10.230:80;  
  106. server_name  buyer.test.com;  
  107. location / {  
  108. proxy_pass      http://bspbuyersvr;  
  109. include         proxy_setting.conf;  
  110. }  
  111. access_log  logs/buyer.log  test_com;  

  1. 		#seller.test.com  
  2. server {  
  3. listen       10.10.10.230:80;  
  4. server_name  seller.test.com;  
  5. location / {  
  6. proxy_pass      http://bspsellersvr;  
  7. include         proxy_setting.conf;  
  8. }  
  9. access_log  logs/seller.log  test_com;  
  10. }  
  11. #wsi.test.com  
  12. server {  
  13. listen       10.10.10.230:80;  
  14. server_name  wsi.test.com;  
  15. location / {  
  16. proxy_pass      http://bspwsisvr;  
  17. include         proxy_setting.conf;  
  18. }  
  19. access_log  logs/wsi.log  test_com;  
  20. }  
  21. #www.test.com  
  22. server {  
  23. listen       10.10.10.230:80;  
  24. server_name  www.test.com   *.test.com;  
  25. location ~ ^/NginxStatus/ {  
  26. stub_status on;  
  27. access_log off;  
  28. }  
  29. location / {  
  30. proxy_pass      http://bspfrontsvr;  
  31. include         proxy_setting.conf;  
  32. }  
  33. access_log  logs/www.log  test_com;  
  34. error_page   500 502 503 504  /50x.html;  
  35. location = /50x.html {  
  36. root   html;  
  37. }  
  38. }  
  39. #login.test.com  
  40. server {  
  41. listen       10.10.10.230:443;  
  42. server_name  login.test.com;  
  43. ssl                  on;  
  44. ssl_certificate      cert.pem;  
  45. ssl_certificate_key  cert.key;  
  46. ssl_session_timeout  5m;  
  47. ssl_protocols  SSLv2 SSLv3 TLSv1;  
  48. ssl_ciphers  ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;  
  49. ssl_prefer_server_ciphers   on;  
  50. location / {  
  51. proxy_pass        https://bsploginsvr;  
  52. include         proxy_setting.conf;  
  53. }  
  54. access_log  logs/login.log  test_com;  
  55. }  
  56. #login.test.com for register  
  57. server {  
  58. listen       10.10.10.230:80;  
  59. server_name  login.test.com;  
  60. location / {  
  61. proxy_pass        http://bspregistersvr;  
  62. include         proxy_setting.conf;  
  63. }  
  64. access_log  logs/register.log  test_com;  
  65. }  
  66.  
  67. }  
  68.  
  69. proxy_redirect          off;  
  70. proxy_set_header        Host $host;  
  71. proxy_set_header        X-Real-IP $remote_addr;  
  72. proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;  
  73. client_max_body_size    10m;  
  74. client_body_buffer_size 128k;  
  75. proxy_connect_timeout   90;  
  76. proxy_send_timeout      90;  
  77. proxy_read_timeout      90;  
  78. proxy_buffer_size       4k;  
  79. proxy_buffers           4 32k;  
  80. proxy_busy_buffers_size 64k;  
  81. proxy_temp_file_write_size 64k; 

mod_proxy的例子:


  1. 		 
  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.  

推荐阅读
  • Linux下部署Symfoy2对app/cache和app/logs目录的权限设置,symfoy2logs
    php教程|php手册xml文件php教程-php手册Linux下部署Symfoy2对appcache和applogs目录的权限设置,symfoy2logs黑色记事本源码,vsco ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • 本文介绍了使用cacti监控mssql 2005运行资源情况的操作步骤,包括安装必要的工具和驱动,测试mssql的连接,配置监控脚本等。通过php连接mssql来获取SQL 2005性能计算器的值,实现对mssql的监控。详细的操作步骤和代码请参考附件。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 解决php错误信息不显示在浏览器上的方法
    本文介绍了解决php错误信息不显示在浏览器上的方法。作者发现php中的各种错误信息并不显示在浏览器上,而是需要在日志文件中查看。为了解决这个问题,作者提供了一种解决方式:通过修改php.ini文件中的display_errors参数为On,并重启服务。这样就可以在浏览器上直接显示php错误信息了。 ... [详细]
  • 目录浏览漏洞与目录遍历漏洞的危害及修复方法
    本文讨论了目录浏览漏洞与目录遍历漏洞的危害,包括网站结构暴露、隐秘文件访问等。同时介绍了检测方法,如使用漏洞扫描器和搜索关键词。最后提供了针对常见中间件的修复方式,包括关闭目录浏览功能。对于保护网站安全具有一定的参考价值。 ... [详细]
  • Tomcat安装与配置教程及常见问题解决方法
    本文介绍了Tomcat的安装与配置教程,包括jdk版本的选择、域名解析、war文件的部署和访问、常见问题的解决方法等。其中涉及到的问题包括403问题、数据库连接问题、1130错误、2003错误、Java Runtime版本不兼容问题以及502错误等。最后还提到了项目的前后端连接代码的配置。通过本文的指导,读者可以顺利完成Tomcat的安装与配置,并解决常见的问题。 ... [详细]
  • 负载均衡_Nginx反向代理动静分离负载均衡及rewrite隐藏路径详解(Nginx Apache MySQL Redis)–第二部分
    nginx反向代理、动静分离、负载均衡及rewrite隐藏路径详解 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • iOS超签签名服务器搭建及其优劣势
    本文介绍了搭建iOS超签签名服务器的原因和优势,包括不掉签、用户可以直接安装不需要信任、体验好等。同时也提到了超签的劣势,即一个证书只能安装100个,成本较高。文章还详细介绍了超签的实现原理,包括用户请求服务器安装mobileconfig文件、服务器调用苹果接口添加udid等步骤。最后,还提到了生成mobileconfig文件和导出AppleWorldwideDeveloperRelationsCertificationAuthority证书的方法。 ... [详细]
  • nginx+多个tomcat
    学习nginx的时候遇到的问题:nginx怎么部署两台tomcat?upstream在网上找的资源,我在nginx配置文件(nginx.conf)中添加了两个server。结果只显 ... [详细]
  • Nginx Buffer 机制引发的下载故障
    Nginx ... [详细]
author-avatar
爱你不愿放cwy
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有