Transients API 란 무엇입니까?
게시 됨: 2020-12-16웹 사이트 성능은 종종 캐싱이라는 개념을 중심으로 진행됩니다. 즉, 데이터를 즉시 액세스 할 수있는 준비 상태로 저장하여 브라우저에서 더 빠르게 재현 할 수 있도록합니다. WordPress Transients API는 캐싱을위한 도구이며 WordPress 웹 사이트의 성능을 향상시키는 강력한 방법입니다.
캐싱이란 무엇이며 왜 사용합니까?
브라우저가 웹 페이지를 요청할 때마다 서비스 서버는 복잡하고 시간이 많이 걸리는 계산을 많이해야하므로 지연이 발생합니다. 쿼리를 실행 한 후 캐싱 기술 덕분에 서버는 최종 결과를 기억하고 두 번째 요청시 동일한 계산을 다시 수행하지 않고도 브라우저에 제공 할 수 있습니다. 따라서 이전 리소스를 캐시하고 재사용하는 기능은 성능 최적화에 매우 중요합니다.
아주 간단히 캐싱은 캐싱 계층에 정보를 임시로 저장하는 옵션을 제공합니다.
캐싱의 유형은 무엇입니까?
다양한 유형의 캐싱이 있으며 이들을 조합하여 사용하면 더 높은 수준의 성능을 얻을 수 있습니다.
브라우저 캐싱
웹 페이지의 내용을 열기 전에 브라우저에는 JavaScript 파일, 스타일 시트, 글꼴 등과 같은 많은 것들이 필요하며, 페이지 내용과 함께 다운로드되는 모든 것들이 필요합니다.
브라우저가 이러한 파일을 캐시하는 경우 웹 사이트를로드 할 때마다 다운로드 할 필요가 없습니다. 사이트를 처음로드하는 데 일반적으로 몇 초가 걸리지 만 브라우저가 해당 파일을 캐시 한 후에는로드 시간이 크게 단축됩니다.
서버 캐싱
서버 캐싱은 특정 페이지에 대한 HTML 파일을 저장하고 각 후속 요청에 대해 사용하는 것을 의미합니다. 이것은 소위 전체 페이지 캐시입니다.
또 다른 유형의 서버 캐시가 있습니다. 개체 캐시는 전체 페이지 캐시와 달리 특정 정보 비트 (조각) 만 캐시합니다.
페이지 캐싱
가장 효과적인 캐시로 간주됩니다. 그 이름은 그것이 작동하는 방식에 대해 자명합니다. 사용자 'A'가 페이지를 방문하면 웹 사이트에서 페이지를 만들고 콘텐츠를 사용자의 브라우저에 반환합니다. 페이지 캐시가 실행되면이 페이지 콘텐츠가 저장되므로 사용자 'B'가 동일한 페이지를 방문하면 페이지 캐시가 이전에 보낸 콘텐츠를 재현합니다.
페이지 캐시의 가장 큰 장점은 캐시 된 페이지가 거의 액세스 순간에 반환된다는 것입니다. 그 결과, 메모리 속도가 가장 낮고 CPU 사용량이 적은 가장 약한 서버에서도 수백만 건의 요청이 처리되고 페이지가 재생됩니다.
그러나 이러한 유형의 캐시에는 또한 단점이 있습니다. 예를 들어 권한이 부여 된 사용자 또는 페이지 콘텐츠가 현재 사용자 변수에 의존하는 사용자의 페이지를 캐시 할 수 없다는 것입니다.
데이터베이스 캐싱
데이터베이스 캐싱은 백엔드 데이터베이스에 액세스하여 주문형 (동적)으로 웹 페이지를 생성하는 컴퓨터 애플리케이션 설계에 포함 된 프로세스입니다. 데이터베이스 캐시는 일반적으로 자주 액세스하는 읽기 데이터의 형태로 불필요한 압력을 제거하여 기본 데이터베이스를 향상시킵니다. 캐시 자체는 데이터베이스, 애플리케이션을 포함한 여러 영역에서 또는 독립형 레이어로 작동 할 수 있습니다.
이러한 응용 프로그램이 브라우저 기반 클라이언트, 웹 응용 프로그램 서버 및 백엔드 데이터베이스를 포함하는 다중 계층 환경에 배포 될 때 중간 계층 데이터베이스 캐싱을 사용하여 높은 확장 성과 성능을 달성합니다.
개체 캐싱
WordPress (개체 캐시)의 개체 캐싱에는 데이터베이스 쿼리 저장이 포함됩니다. 모든 유형의 데이터 (객체)를 저장하고 필요할 때 검색 할 수있는 기본 제공 시스템 메커니즘입니다. 이 캐시는 복잡한 작업의 결과를 저장하는 데 사용됩니다.
WordPress 사이트에서 활성화하면 PHP 실행 시간을 단축하고 사이트 방문자에게 콘텐츠를 더 빠르게 제공하며 데이터베이스의 부하를 줄이는 데 도움이됩니다.
CDN (콘텐츠 전송 네트워크)
웹 서비스 및 사이트 사용자에게 콘텐츠를 빠르게 제공하는 지리적으로 분산 된 네트워크 인프라입니다. CDN에 포함 된 서버는 사이트 / 서비스 사용자의 응답 시간을 최소화하는 방식으로 지리적으로 위치합니다.
WordPress의 Transients API 란 무엇입니까?
Transients API는 브라우저 캐싱과는 반대로 웹 사이트의 데이터베이스에 정보 블록 (코드 문자열, HTML 콘텐츠, WP_Query Objects, JSON)을 저장하는 방법입니다. Transients API는 Options API와 매우 유사하지만, 주요 차이점은 Transients API 에는 만료 시간이 있거나 수명이 더 좋다는 것입니다.
과도 상태에 대한 세 가지 주요 작업은 값 설정, 값 가져 오기 및 값 삭제입니다 .
1. 과도 설정 –
set_transient ($ key, $ value, $ expires);
과도 상태를 설정하려면 세 가지 구성 요소가있는 set_transient () 함수를 사용할 수 있습니다.
- 키 – 일시적인 고유 한 짧은 이름입니다. 길이는 172 자 이하 여야합니다.
- 값 – 데이터베이스에 저장 될 정보를 포함하는 모든 유형의 PHP 변수.
- 만료 시간 (수명) – 정보가 저장되는 기간입니다.
예를 들어 하루 동안 목록 게시물 쿼리를 저장하려는 경우 :
set_transient ( 'unique_listing_posts_query_results_name',$ listing_posts_query_results, DAY_IN_SECONDS);
보시다시피 시간을 쉽게 표현하기 위해 WordPress 3.5에 도입 된 여러 시간 상수 중 하나 (DAY_IN_SECONDS)를 사용했습니다. 다음은 모든 시간 상수의 전체 목록입니다.
MINUTE_IN_SECONDS = 60 (초) HOUR_IN_SECONDS = 60 * MINUTE_IN_SECONDS DAY_IN_SECONDS = 24 * HOUR_IN_SECONDS WEEK_IN_SECONDS = 7 * DAY_IN_SECONDS MONTH_IN_SECONDS = 30 * DAY_IN_SECONDS YEAR_IN_SECONDS = 365 * DAY_IN_SECONDS
2. 과도 상태 얻기 –
get_transient ($ key);
저장된 과도 상태를 얻으려면
get_transient ($ transient_name);
우리의 경우 다음과 같이 쿼리 결과를 나열하는 게시물을 가져올 수 있습니다.
get_transient ( 'unique_listing_posts_query_results_name' );
나중에 예제 섹션에서 더 자세히 살펴 보겠습니다.
3. 임시 삭제 –
delete_transient ($ key);
이전 하위 섹션에서 설명했듯이 Transients API를 사용하여 데이터베이스에 대한 원격 또는 로컬 (데이터베이스의 콘텐츠 또는 쿼리) 응답을 가져오고 저장할 수 있습니다.
그러나 이전에 저장된 콘텐츠를 삭제하는 방법 (일시적)에 대한 질문이 있습니다. 과도 상태를 지우 (삭제)하는 방법에는 두 가지가 있습니다.
자동 삭제
과도 상태의 멋진 점은 만료 시간 (수명)을 설정 하면 자동으로 만료된다는 것입니다. 데이터베이스가 만료 된 후 임시 데이터베이스를 검색하려고하면 WordPress가 자동으로 삭제하여 혼란을 방지합니다. 누군가 웹 사이트를 열면 일시적인 상태가 다시 생성됩니다. 이렇게하면 원격 또는 로컬 API의 새로운 콘텐츠가 있는지 확인할 수 있습니다.
수동 삭제
때로는 수동으로 삭제하여 과도 상태를 조기에 강제 종료해야 할 수도 있습니다. 이것은 주어진 활동 (새 메뉴 항목 추가, 게시물 저장 또는 업데이트, 카테고리 추가 또는 업데이트 등)이 캐시 된 데이터를 본질적으로 부실하고 업데이트가 필요한 경우에 유용합니다.
우리가 사용해야 할 기능은
delete_transient ($ transient_name)
우리의 경우에는 다음과 같아야합니다.
delete_transient ( 'unique_listing_posts_query_results_name' );
참고 : 재 작성할 수없는 귀중한 데이터를 저장하기 위해 과도 상태를 사용하지 않는 것이 중요합니다!
Transients API를 사용해야하는 이유는 무엇입니까?
자주 변경되지 않고 캐시하려는 계산 집약적 인 값이있을 때마다 Transients API를 사용할 수 있습니다. WordPress에서 이것은 일반적으로 데이터베이스 쿼리의 결과 개체가 될 것이지만 실제로는 스칼라 값, 배열 또는 개체 여부에 관계없이 변수에 저장하는 모든 것이 될 수 있습니다.
따라서 테마와 플러그인에서 복잡한 쿼리를 수행 할 때 모든 과도 상태가 좋습니다.
원격 또는 로컬 응답 캐싱의 이점
원격 API 응답
Remote API는 항상 원격 서버에 여러 번 호출하거나 요청하며 약간의 추가 대기 시간이 있습니다. 시간이 걸리고 지연이 발생합니다. 또한 일부 원격 API에는 속도 제한이있을 수 있습니다. 즉, 지정된 기간 내에 최대 요청 제한에 도달 할 수 있습니다.
이미 알고 있듯이 Transients API를 활용하여 원격 서버의 응답 (결과)을 캐시하고이를 데이터베이스에 저장할 수 있습니다. 이제 우리는
get_transient ();
메소드를 사용하고 다른 원격 호출이나 요청없이 필요할 때마다 저장된 (캐시 된) 결과 / 콘텐츠를 표시합니다.

이 모든 것이 :
- 원격 HTTPS 호출 및 요청 감소
- CPU 서버 사용량 줄이기
- 웹 사이트 페이지로드 시간 개선
로컬 API 응답
– 기본적으로 데이터베이스의 HTML 또는 쿼리 결과. Transients API는 원격 응답을 캐싱 할뿐만 아니라 HTML 콘텐츠 또는 쿼리 결과를 로컬 데이터베이스에 저장할 때도 사용할 수 있습니다. 웹 사이트 (위젯, 슬라이더, 메뉴 등)에 반복 가능한 HTML 섹션을 표시하거나 누군가가 웹 사이트를 방문 할 때마다 복잡하거나 느린 데이터베이스 쿼리가 트리거되는 것을 방지하려는 경우 매우 유용합니다.
과도 상태를 언제 어디서 사용합니까?
- 복잡한 사용자 지정 데이터베이스 쿼리
- WordPress 탐색 메뉴
- 다음과 같은 정보를 표시하는 사이드 바 위젯; 트윗, 최근 사이트 방문자 목록 또는 특정 카테고리의 게시물 목록
- 태그 클라우드 캐싱
- 외부 HTTP 요청 캐싱
사용법 및 예
많은 설명을 마친 후에 실제 사례를 볼 시간입니다.
기본 사용법
function get_my_data () { $ data = get_transient ( 'my_transient_name'); if (false === $ data) {// 임시 만료 / 설정되지 않음 $ data = fetch_my_data (); // 원본 소스에서 데이터 가져 오기 set_transient ( 'my_transient_name', $ data, HOUR_IN_SECONDS); } $ data 반환; }
fetch_my_data () 함수는 WP_Query 객체, json 데이터, html 콘텐츠 등을 저장할 수 있습니다.
기본 예
이미 설명했듯이 이러한 유형의 캐싱은 긴 작업의 결과를 저장하는 데 유용하며 가장 간단한 예는 Facebook과 같은 외부 API에 액세스하는 것입니다.
Facebook API에 액세스하여 your-website.url 개체 (더 정확하게는 페이지)를 요청하고 페이지의 좋아요 수를 반환하는 다음 함수가 있다고 가정 해보십시오.
function get_facebook_likes () { $ result = wp_remote_get ( 'https://graph.facebook.com/your-website.url'); $ result = json_decode (wp_remote_retrieve_body ($ result)); $ result-> likes 반환; } echo "Facebook 좋아요 :". get_facebook_likes ();
이 기능의 실행 시간은 Facebook 서버와 관련된 서버의 위치, 네트워크의 상태 및 속도 등 여러 요인에 따라 달라집니다. 평균적으로 기능은 1 ~ 3 초가 소요될 수 있습니다.
즉, 사이트에서이 기능을 사용하면 각 페이지의 로딩 시간이 1 ~ 3 초 늘어납니다. 또한이 함수를 500 초 동안 500 번 이상 호출하면 Facebook이 결과 대신 오류를 생성하기 시작합니다.
이 기능의 속도를 높이기 위해 WordPress Transients API를 사용하고 결과를 1 시간 동안 저장할 수 있습니다.
function get_facebook_likes () { if (false === ($ likes = get_transient ( 'fb_likes'))) { $ result = wp_remote_get ( 'https://graph.facebook.com/your-website.url'); $ result = json_decode (wp_remote_retrieve_body ($ result)); $ likes = $ result-> likes; // 1 시간 동안 초 단위로 과도 설정 set_transient ( 'fb_likes', $ likes, 1 * HOUR_IN_SECONDS); } $ likes 반환; }
따라서이 함수가 처음 호출되면 Facebook에서 요청을받은 후 WordPress가 결과를 데이터베이스에 쓰고 향후 Facebook 서버에 반복 요청을하지 않고 1 시간 동안 데이터베이스에서이 결과를 반환합니다. 그리고 한 시간 후에 기능은 데이터를 위해 다시 Facebook으로 전환됩니다.
이 방법을 사용하면 시간당이 함수를 한 번만 호출하면 요청 시간이 1-3 초 증가하고 후속 호출이 즉시 발행됩니다.
더 복잡한 예
약 100 개의 카테고리와 약 50,000 개의 게시물이있는 웹 사이트가 있고 웹 사이트의 단일 게시물 디자인에 현재 게시물이있는 카테고리의 N 개의 관련 게시물을 표시하는 위젯이 있다고 가정 해보십시오. 예상대로이 복잡한 쿼리는 데이터베이스에서 결과를 가져와 웹 사이트에 표시하는 데 시간이 걸립니다.
이제 웹 사이트에 동시에 액세스하는 10,000 명의 사용자가 있다고 가정 해보십시오. 이는 쿼리를 수행 해야하는 10,000 개 이상의 데이터베이스 요청이 있음을 의미합니다 (이는 wp_terms, wp_term_relationships, wp_term_taxonomy, wp_posts 테이블을 통해 검색하는 복잡한 쿼리이므로 10,000 개 이상의 쿼리입니다). 관련 카테고리의 N 게시물에 대한 결과를 가져와 프런트 엔드에 표시합니다. 이로 인해 데이터베이스에 과부하가 걸리고 웹 사이트의 전체 로딩 시간이 지연되며 경우에 따라 데이터베이스 과부하로 인해 충돌이 발생하기도합니다.
그리고 여기에 데이터베이스 쿼리 및 요청 수를 최적화하고 줄일 수있는 방법에 대한 질문이 있습니다. Transients API를 활용하고 쿼리 객체를 캐시하거나 전체 HTML 출력을 캐시 할 수있을 때마다 왜 그렇게 많은 쿼리가 발생합니까? 이렇게하면 데이터베이스 쿼리 수를 줄이고 최적화하여 웹 사이트 성능과 사용자 경험을 향상시킬 수 있습니다.
우리의 경우 쿼리는 wp_terms, wp_term_relationships, wp_term_taxonomy, wp_posts 테이블 에서 모든 예상 결과를 검색합니다.
다음은이를 수행 할 수있는 방법에 대한 완전한 예입니다.
function show_posts_from_category () { $ args = array ( 'cat'=> 555, // 무작위 카테고리 ID 'posts_per_page'=> 8, // 표시 할 관련 게시물의 임의 수 'No_found_rows'=> 참, ); $ hash = md5 ($ args [ 'cat']); // 카테고리 ID의 MD5 해시 $ transient_key = '카테고리-'. $ hash; // 임시 키 if (false === ($ posts_from_category_html = get_transient ($ transient_key))) : // 임시 만료 / 설정되지 않음 $ the_query = 새로운 WP_Query ($ args); // 쿼리 가져 오기 ob_start (); // 출력 버퍼링 켜기 while ($ the_query-> have_posts ()) : $ the_query-> the_post (); ?> <div class = "item"> <div class = "bigthumb"> <a href="<?php the_permalink();?> "rel ="bookmark "title ="<? php the_title ();?> "> <? php if (has_post_thumbnail ()) the_post_thumbnail ( 'big-thumb' ); ?> </a> </ div> <h3> <a href="<?php the_permalink();?> "rel ="bookmark "title ="<? php the_title ();?> "> <? php the_title (); ?> </a> </ h3> <? php the_excerpt (); ?> </ div> <? php 끝까지; $ post_from_category_html = ob_get_contents (); // 출력 버퍼를 지우지 않고 내용을 가져옵니다. ob_end_clean (); //이 출력 버퍼링을 끕니다. set_transient ($ transient_key, $ posts_from_category_html, $ transient_expire = 15 * MINUTE_IN_SECONDS); // 만료 시간 15 분으로 과도 상태 설정 wp_reset_postdata (); endif; return $ post_from_category_html; }
마지막 생각들
캐싱은 작업 속도를 높일 수있는 좋은 방법이지만, 캐싱중인 항목, 수행 할 수있는 위치,시기 및 방법을 정확히 알아야합니다. 그렇지 않으면 예기치 않은 결과에 직면 할 위험이 있습니다.
의도 한대로 작동하는지 확실하지 않은 경우 항상 프로파일 링으로 전환하십시오. 데이터베이스에 대한 각 쿼리를 살펴보고 모든 PHP 함수 호출, 타이밍 및 메모리 사용량을 살펴보십시오.
Transients API는 WordPress 웹 사이트의 로딩 시간을 최적화하고 탁월한 사용자 경험을 제공하는 좋은 방법입니다. 플러그인과 테마에서 과도 현상을 사용하는 것은 간단하며 코드 몇 줄만 추가하면됩니다. 긴 데이터베이스 쿼리 또는 복잡한 처리 데이터와 같은 적절한 상황에서 사용하면 사이트의로드 시간을 몇 초 단축 할 수 있습니다.