> 백엔드 개발 > PHP 튜토리얼 > PHP의 캐싱 기술에 대해 자세히 설명

PHP의 캐싱 기술에 대해 자세히 설명

WBOY
풀어 주다: 2016-07-25 09:11:47
원래의
869명이 탐색했습니다.

일반적인 캐싱 기술

데이터 캐시: 여기서 언급하는 데이터 캐시는 페이지에 접속할 때마다 해당 캐시 데이터가 존재하는지 먼저 감지하여 연결합니다. 데이터베이스를 가져와 데이터를 가져오고 쿼리 결과를 직렬화하여 파일에 저장합니다. 앞으로는 동일한 쿼리 결과를 캐시 테이블이나 파일에서 직접 얻을 수 있습니다.

가장 널리 사용되는 예는 Discuz의 검색 기능으로, 다음에 동일한 키워드를 검색할 때 결과 ID를 테이블에 캐시하고 캐시 테이블을 먼저 검색하는 기능입니다.

일반적인 방법은 여러 개의 테이블이 연관되어 있는 경우 배열을 생성하고, 첨부된 테이블의 내용을 기본 테이블의 필드에 저장하는 것입니다. 이 방법의 장점은 하나의 테이블만 가능하다는 것입니다. 읽을 수 있지만 단점은 두 데이터를 동기화하는 데 더 많은 단계가 있다는 것입니다. 데이터베이스는 항상 속도를 위해 병목 현상을 발생시키는 것이 핵심입니다.

페이지 캐싱: 페이지에 액세스할 때마다 먼저 해당 캐시된 페이지 파일이 있는지 여부를 감지합니다. 존재하지 않는 경우 데이터베이스에 연결하여 데이터를 가져오고 동시에 페이지를 표시하며 캐시된 페이지 파일을 생성합니다. 다음에 방문할 때 페이지 파일이 재생되도록 합니다. (템플릿 엔진과 인터넷의 일부 일반적인 캐시 클래스에는 일반적으로 이 기능이 있습니다.)

시간 트리거 캐시: 파일이 존재하는지, 타임스탬프가 설정된 만료 시간보다 짧은지 확인하세요. 파일 수정 타임스탬프가 현재 타임스탬프에서 만료 타임스탬프를 뺀 값보다 큰 경우 캐시를 사용하고, 그렇지 않으면 캐시를 업데이트하세요.

콘텐츠 트리거 캐싱: 데이터가 삽입되거나 업데이트될 때 캐시를 강제로 업데이트합니다.

정적 캐시: 여기서 언급하는 정적 캐시는 HTML이나 XML 등의 텍스트 파일을 직접 생성하여 업데이트 시 다시 생성하는 정적 캐시를 의미하므로 크게 변경되지 않는 페이지에 적합하므로 여기서는 다루지 않겠습니다.

위 내용은 코드 수준의 솔루션입니다. 다른 프레임워크를 직접 CP하고 변경하기가 너무 게으릅니다. 내용도 비슷하고, 하기 쉽고, 여러 가지 방법으로 사용할 수 있지만, 다음 내용은 서버 측 캐싱 솔루션, 비코드 수준에서는 여러 당사자의 협력이 필요합니다.

메모리 캐시: Memcached는 동적 애플리케이션에서 데이터베이스 로드를 줄이고 액세스 속도를 향상시키는 데 사용되는 고성능 분산 메모리 개체 캐싱 시스템입니다.

Memcached의 예는 다음과 같습니다.

  1. $memcache = new Memcache;
  2. $memcache->connect('localhost', 11211) 또는 사망( "연결할 수 없습니다.");
  3. $version = $memcache->getVersion();
  4. echo "서버 버전: ".$version."n";
  5. $tmp_object = new stdClass;
  6. $tmp_object->str_attr = 'test';
  7. $tmp_object->int_attr = 123;
  8. $memcache->set('key', $tmp_object, false, 10) 또는 die("실패했습니다. 서버에 데이터 저장");
  9. echo "데이터를 캐시에 저장(데이터는 10초 후에 만료됨)n";
  10. $get_result = $memcache->get('key');
  11. echo "캐시 데이터:n";
  12. var_dump($get_result);
  13. ?>
코드 복사

읽기 라이브러리의 예 :

  1. $sql = 'SELECT * FROM users';
  2. $key = md5($sql) //memcached 객체 식별자
  3. if ( !($datas = $mc->get($key)) ) {
  4. // memcached에서 캐시된 데이터를 가져오지 못한 경우 데이터베이스 쿼리를 사용하여 레코드 세트를 가져옵니다.
  5. echo "n".str_pad('MySQL에서 데이터를 읽습니다.', 60, '_')."n";
  6. $conn = mysql_connect('localhost', 'test', 'test');
  7. mysql_select_db('test');
  8. $result = mysql_query($sql);
  9. while ($row = mysql_fetch_object($result))
  10. $datas[] = $row;
  11. //다음 접속 시 사용할 수 있도록 데이터베이스에서 얻은 결과 세트 데이터를 memcached에 저장합니다.
  12. $mc->add($key, $datas);
  13. } else {
  14. echo "n".str_pad('memcached에서 데이터를 읽습니다.', 60, '_')."n ";
  15. }
  16. var_dump($datas);
  17. ?>
코드 복사

php 버퍼: eaccelerator, apc, phpa, xcache 등이 있습니다. 이것저것 검색해서 직접 확인해 보세요.

MYSQL 캐시: 이는 코드 수준이 아닌 것으로 간주됩니다. 클래식 데이터베이스는 이 방법을 사용합니다. 아래 실행 시간을 보면 0.09xxx 등입니다. 파란색 옷을 입은 남자가 my.ini를 수정한 부분을 올려보겠습니다. 2G MYISAM 테이블은 거의 1년 동안 수정했다고 합니다

코드 복사 상자

  1. [클라이언트]
  2. default-character-set=gbk
  3. default-storage-engine=MYISAM
  4. max_connections =600
  5. max_connect_errors=500
  6. back_log=200
  7. interactive_timeout=7200
  8. query_cache_size=64M
  9. ……
  10. table_cache=512
  11. ……
  12. myisam_max_sort_file_size=100G
  13. myisam_max_extra_sort_file_size=100G
  14. myisam_sort_buffer_size=128M
  15. key_buffer_size=1024M
  16. read_buffer_size=512M
  17. thread_concurrency=8
코드 복사

역방향 프록시 기반 웹 캐싱: Nginx, SQUID, mod_proxy 등 (Apache2 이상은 mod_proxy, mod_cache로 구분됩니다) NGINX 예

  1. #user none;
  2. worker_processes 4;
  3. error_log 로그/error.log crit;
  4. pidlogs/nginx.pid;
  5. worker_rlimit_nofile 10240;
  6. 이벤트 {
  7. epoll 사용;
  8. worker_connections 51200;
  9. }
  10. http {
  11. include mime. 유형;
  12. default_type 애플리케이션/옥텟-스트림;
  13. sendfile on;
  14. keepalive_timeout 65;
  15. tcp_nodelay on;
  16. # server pool
  17. upstream bspfrontsvr {
  18. server 10.10.10.224: 80 가중치=1;
  19. 서버 10.10.10.221:80 가중치=1;
  20. }

  21. 업스트림 bspimgsvr {

  22. 서버 10.10.10.201:80 가중치=1;
  23. }

  24. upstream bspstylesvr {

  25. server 10.10.10.202:80 Weight=1;
  26. }

  27. upstream bsphelpsvr {

  28. 서버 10.10.10.204:80 가중치=1;
  29. }

  30. 업스트림 bspwsisvr {

  31. 서버 10.10.10.203:80 가중치=1;
  32. }
  33. upstream bspadminsvr {

  34. server 10.10.10.222:80 Weight=1;
  35. }

  36. upstream bspbuyersvr {

  37. 서버 10.10.10.223:80 가중치=1;
  38. }

  39. 업스트림 bspellervr {

  40. 서버 10.10.10.225:80 가중치=1;
  41. }
  42. 업스트림 bsploginsvr {
  43. 서버 10.10.10.220:443 가중치=1;
  44. }
  45. 업스트림 bspregistersvr {
  46. 서버 10.10.10.220:80 가중치=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. 서버 {
  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_loglogs/img.log test_com;
  60. }

  61. #style.test.com

  62. 서버 {
  63. 10.10.10.230:80 듣기;
  64. server_name style.test.com;
  65. 위치 / {
  66. proxy_pass http://bspstylesvr;
  67. include proxy_setting.conf;
  68. }
  69. access_loglogs/style.log test_com;
  70. }

  71. #help.test.com

  72. 서버 {
  73. 듣기 10.10.10.230:80;
  74. server_name help.test.com;
  75. 위치 / {
  76. proxy_pass http://bsphelpsvr;
  77. include proxy_setting.conf;
  78. }
  79. access_loglogs/help.log test_com;
  80. }

  81. #admin.test.com

  82. 서버 {
  83. listen 10.10.10.230:80;
  84. server_name admin.test.com;
  85. 위치 / {
  86. proxy_pass http://bspadminsvr;
  87. include proxy_setting.conf;
  88. }
  89. access_loglogs/admin.log test_com;
  90. }

  91. # buyer.test.com

  92. 서버 {
  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_loglogs/buyer.log test_com;
  100. }

  101. #seller.test.com

  102. 서버 {
  103. 듣기 10.10.10.230:80;
  104. server_name Seller.test.com;
  105. 위치 / {
  106. proxy_pass http://bspellervr;
  107. include Proxy_setting.conf;
  108. }
  109. access_log 로그/ Seller.log test_com;
  110. }
  111. #wsi.test.com
  112. 서버 {
  113. 듣기 10.10.10.230:80;
  114. server_name wsi.test.com;
  115. 위치 / {
  116. proxy_pass http://bspwsisvr;
  117. include proxy_setting.conf;
  118. }
  119. access_loglogs/wsi.log test_com;
  120. }
  121. #www.test.com
  122. 서버 {
  123. 10.10.10.230:80 듣기;
  124. server_name www.test.com *.test.com;
  125. 위치 ~ ^/NginxStatus/ {
  126. stub_status on;
  127. access_log off;
  128. }
  129. 위치 / {
  130. proxy_pass http://bspfrontsvr;
  131. include proxy_setting.conf;
  132. }
  133. access_loglogs/www.log test_com;
  134. error_page 500 502 503 504 /50x .html;
  135. 위치 = /50x.html {
  136. 루트 html;
  137. }
  138. }
  139. #login.test.com
  140. 서버 {
  141. 듣기 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: 높음: 중간: 낮음: SSLv2: EXP;
  149. ssl_prefer_server_ciphers on;
  150. location / {
  151. proxy_pass https://bsploginsvr;
  152. include Proxy_setting. conf;
  153. }
  154. access_loglogs/login.log test_com;
  155. }
  156. 등록
  157. 서버용 #login.test.com {
  158. listen 10.10.10.230:80;
  159. server_name login.test.com;
  160. 위치 / {
  161. proxy_pass http://bspregistersvr;
  162. include proxy_setting.conf;
  163. }
  164. access_loglogs/register.log test_com;
  165. }
  166. }

  167. proxy_redirect off;
  168. proxy_set_header 호스트 $host;
  169. proxy_set_header X-Real-IP $remote_addr;
  170. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  171. client_max_body_size 10m;
  172. client_body_buffer_size 128k;
  173. proxy_connect_timeout 90;
  174. proxy_send_timeout 90;
  175. proxy_read_timeout 90;
  176. proxy_buffer_size 4k;
  177. proxy_buffers 4 32k;
  178. proxy_busy_buffers_size 64k;
  179. proxy_temp_file_write_size 64k;

코드 복사

mod_proxy의 예:

  1. ServerName www.zxsv.com
  2. ServerAdmin admin@zxsv.com
  3. # 역방향 프록시 설정
  4. ProxyPass / http://www.zxsv.com:8080/
  5. ProxyPassReverse / http://www.zxsv.com:8080/
  6. # 캐시 디렉토리 루트
  7. CacheRoot "/var/www/ 프록시"
  8. # 최대 캐시 저장 공간
  9. CacheSize 50000000
  10. # 시간: 4시간마다
  11. CacheGcInterval 4
  12. # 최대 페이지 만료 시간: 시간
  13. CacheMaxExpire 240
  14. # 만료 시간 = (현재 - last_modified) * CacheLastModifiedFactor
  15. CacheLastModifiedFactor 0.1
  16. # 기본 만료 태그: 시간
  17. CacheDefaultExpire 1
  18. # 검색된 콘텐츠의 비율 이후 강제 완료: 60-90%
  19. CacheForceCompletion 80
  20. CustomLog /usr/local/apache/logs/dev_access_log 결합
코드 복사

SQUID 예제는 여기를 참조하세요.

DNS 폴링: BIND는 오픈 소스 DNS 서버 소프트웨어입니다. 직접 검색해 보면 누구나 그 존재를 알 수 있습니다. chinacache 같은 일부 대형 웹사이트에서는 이렇게 하는 것으로 알고 있는데, 간단히 말하면 동일한 페이지나 파일이 서로 다른 서버에 캐시되어 북쪽과 남쪽에 따라 해당 서버로 자동으로 파싱되는 것입니다.



관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿