어디서나 객체 캐시
WordPress는 가능한 한 많은 데이터베이스 쿼리 수를 줄이려고합니다.
예를 들어, 메타 필드 또는 분류 체계 필드를 얻을 때마다 데이터베이스를 쿼리하기 전에 WordPress가 해당 쿼리가 이미 쿼리되어 캐시에 저장되어 있는지 확인한 다음 데이터베이스를 쿼리하는 대신 해당 필드에서 반환합니다.
"캐시 작업"은 WP_Object_Cache
클래스 및 wp_cache_*
함수 (해당 클래스 메소드의 랩퍼)를 통해 수행됩니다 .
캐시가있는 곳
기본적으로 "캐시"는 PHP 전역 변수에 지나지 않습니다. 메모리에 있음을 의미하지만 모든 요청에서 사라지는 것을 의미합니다.
그러나 드롭 인 ( advanced-cache.php
및 / 또는 object-cache.php
)을 통해이 캐시를 처리하는 사용자 정의 방법을 설정할 수 있습니다.
일반적으로이 드롭 인은 단일 요청을 "생존"하는 일종의 캐싱 메커니즘을 설정하는 데 사용됩니다.
이러한 이유로, WP 사람들 사이에서 "퍼시 스턴트 캐시"플러그인으로 알려져 있습니다 (버블 외부에서 "캐시"와 "퍼시 스턴트"라는 단어가 함께 이해되지는 않습니다).
요즘 인기있는 선택은 Memcached 또는 Redis 입니다.
따라서 "영구 캐시"플러그인을 사용하면 모든 요청에서 캐시가 업데이트되지 않기 때문에 데이터베이스 쿼리 수를 대폭 줄일 수 있습니다.
몇 가지 예
$foo = get_post_meta('foo', $post_id, true);
// a lot of code in the middle
$bar = get_post_meta('bar', $post_id, true);
위의 두 줄의 코드는 최대 1 개의 데이터베이스 쿼리를 트리거합니다.
실제로 사용자 정의 필드를 쿼리하면 해당 게시물의 모든 필드가 데이터베이스에서 검색되고 개체 캐시를 통해 캐시되며 후속 요청은 db가 아닌 캐시에서 데이터를 가져옵니다.
분류 용어에 대해서도 마찬가지입니다. WordPress는 분류에 대한 모든 용어를 한 번 가져온 다음 캐시에서 반환합니다.
개체 캐시는 WordPress에서 매우 널리 사용됩니다. 게시물, 메타 값 및 분류법뿐만 아니라 사용자, 의견, 테마 데이터도 ...
WP_Query
이 모든 것과 어떤 관련 이 있습니까?
을 통해 일부 게시물을 쿼리 할 때 WP_Query
기본적으로 WordPress는 데이터베이스에서 (또는 캐시 된 경우 캐시에서) 게시물을 가져올 뿐만 아니라 가져온 모든 게시물과 관련된 모든 사용자 정의 필드 및 모든 분류 체계에 대한 캐시를 업데이트합니다 .
따라서 예를 들어 호출 get_the_terms()
하거나 get_post_meta()
게시물을 반복하는 동안 WP_Query
실제로 데이터베이스 쿼리를 트리거하지 않고 캐시에서 정보를 가져옵니다.
좋은가요?
네,하지만 비용이 듭니다.
메타를 위해 및 분류 체계 WP_Query
를 update_meta_cache
위해 게시물을 가져올 때 WordPress에서 수행하는 캐시 업데이트 "마법" update_object_term_cache
.
해당 함수의 소스 코드를 보면 WordPress가 각 함수마다 하나의 db 쿼리를 수행하지만 많은 처리를 수행한다는 것을 알 수 있습니다. 예를 들어,에서 update_object_term_cache
가 7 중첩foreach
... 당신은 분류 체계의 많은 경우, 페이지 당 게시물의 수가이 매우 확대됨 아니다 높다.
그 WP_Query
논쟁에 대해 마침내
무엇 'update_post_meta_cache'
과 'update_post_term_cache'
로 설정하면 일은 false
각각 사용자 정의 필드 및 분류 체계에 대한 업데이트 캐시에 워드 프레스를 방지하는 것입니다.
이 경우 사용자 지정 필드 나 분류 체계를 처음 쿼리하면 데이터베이스 쿼리가 트리거되고 데이터가 캐시됩니다.
그만한 가치가 있습니까?
평소와 같이 대답은 에 달려 있습니다. 이러한 값을로 설정하는 대부분의 시간 false
은 불필요한 처리 및 데이터베이스 쿼리가 필요하지 않은 경우를 방지하고 사용자 정의 필드 / 분류법 용어가 처음 필요할 때 캐시가 업데이트되므로 좋은 선택입니다.
그러나 get_post_meta()
루프 중에 한 번이라도 전화를 걸고 get_the_terms()
게시물이 지원하는 모든 분류 (또는 대부분) 를 호출 하려는 경우 캐시 업데이트가 트리거되며 실제 이점이 없을 수 있습니다. 해당 쿼리 인수를로 설정하십시오 false
.
wp_reset_postdata()
를 재설정global $post
하고 재설정하는 이유 는 무엇입니까? 사용자 정의 WP_Query를 수행하면 새로운 캐시 된 객체가 생성되지만 재설정하면 원래 캐시를 가져 오기 위해 다시 쿼리 해야하는 것처럼 들립니다. 아니면이 질문의 맥락에서 너무 멀리 나가고 있습니다.