Giải thích về update_post_ (meta / hạn) _cache


23

Tôi đã đọc qua một số thực tiễn tốt nhất từ ​​10up và họ đề cập đến việc đặt hai cờ này thành false trong WP_Query (tùy thuộc vào những gì bạn đang truy vấn):

  • 'update_post_meta_cache' => false: hữu ích khi bài meta sẽ không được sử dụng.
  • 'update_post_term_cache' => false: hữu ích khi các thuật ngữ phân loại sẽ không được sử dụng.

Tôi giả định rằng nó sử dụng một cái gì đó như thế update_post_caches()nhưng tôi thậm chí không chắc chắn 100% điều đó có nghĩa là gì. Ai đó có thể giải thích hai lá cờ này có ý nghĩa gì trong một WP_Queryvà chúng hữu ích như thế nào không? Càng nhiều thông tin càng tốt vì tôi không biết nhiều về cách WordPress lưu trữ mọi thứ nhưng một câu trả lời được suy nghĩ kỹ về hai lá cờ này cũng được chấp nhận.

Câu trả lời:


30

Bộ đệm đối tượng ở mọi nơi

WordPress cố gắng giảm số lượng truy vấn cơ sở dữ liệu càng nhiều càng tốt.

Ví dụ: bất cứ khi nào bạn nhận được một trường meta hoặc trường phân loại, trước khi truy vấn cơ sở dữ liệu, WordPress sẽ xem xét nếu đó đã được truy vấn và lưu trữ trong bộ đệm và trả về từ đó thay vì truy vấn cơ sở dữ liệu.

"Công việc bộ đệm" được thực hiện thông qua WP_Object_Cachelớp và các wp_cache_*hàm (đó là trình bao bọc cho các phương thức lớp đó.)

Bộ nhớ cache sống ở đâu

Theo mặc định, "bộ đệm" không có gì khác hơn là một biến toàn cục PHP. Nó có nghĩa là nó nằm trong bộ nhớ, nhưng cũng có nghĩa là nó biến mất trong mọi yêu cầu.

Tuy nhiên, thông qua dropins ( advanced-cache.phpvà / hoặc object-cache.php), có thể thiết lập một cách tùy chỉnh để xử lý bộ đệm này.

Thông thường, các dropins này được sử dụng để thiết lập một số loại cơ chế lưu trữ "tồn tại" các yêu cầu số ít.

Vì lý do này, trong số những người WP, chúng được gọi là các plugin "bộ đệm liên tục" (ngay cả khi bên ngoài bong bóng, các từ "bộ đệm" và "liên tục" không có nhiều ý nghĩa với nhau).

Các lựa chọn phổ biến hiện nay là Memcached hoặc Redis .

Vì vậy, bằng cách sử dụng các plugin "bộ đệm liên tục", bạn có thể giảm đáng kể số lượng truy vấn cơ sở dữ liệu, vì bộ đệm không được cập nhật theo mỗi yêu cầu.

Vài ví dụ

$foo = get_post_meta('foo', $post_id, true);
// a lot of code in the middle
$bar = get_post_meta('bar', $post_id, true);

2 dòng mã ở trên sẽ kích hoạt, tối đa, 1 truy vấn cơ sở dữ liệu.

Trong thực tế, khi bạn truy vấn một trường tùy chỉnh, tất cả các trường cho bài đăng đó được truy xuất từ ​​cơ sở dữ liệu, được lưu trữ qua bộ đệm đối tượng và các yêu cầu tiếp theo lấy dữ liệu từ bộ đệm chứ không phải từ db.

Điều tương tự cũng xảy ra đối với các thuật ngữ phân loại, WordPress rút tất cả các thuật ngữ cho phân loại một lần, sau đó trả lại chúng từ bộ đệm.

Bộ đệm đối tượng được sử dụng rất rộng rãi trong WordPress. Không chỉ cho các bài đăng, giá trị meta và phân loại, mà còn cho người dùng, nhận xét, dữ liệu chủ đề ...

Những gì WP_Queryphải làm với tất cả những điều này?

Khi bạn truy vấn một số bài đăng qua WP_Query, theo mặc định, WordPress không chỉ lấy chúng từ cơ sở dữ liệu (hoặc từ bộ đệm nếu chúng được lưu trong bộ nhớ cache) mà còn cập nhật bộ đệm cho tất cả các trường tùy chỉnh và tất cả các phân loại liên quan đến bài đăng được kéo.

Vì vậy, khi bạn gọi, ví dụ, get_the_terms()hoặc get_post_meta()trong khi các bài đăng lặp đi lặp lại WP_Query, bạn thực sự không kích hoạt bất kỳ truy vấn cơ sở dữ liệu nào, nhưng lấy thông tin từ bộ đệm.

Đẹp phải không?

Vâng, có, nhưng nó đi kèm với một chi phí.

Bản cập nhật bộ đệm "ma thuật" mà WordPress thực hiện khi kéo bài đăng qua WP_Queryxảy ra trong update_meta_cachemeta và trong update_object_term_cachephân loại.

Nếu bạn nhìn vào mã nguồn của các hàm đó, bạn sẽ thấy rằng WordPress chỉ thực hiện một truy vấn db trong mỗi hàm, nhưng cũng xử lý rất nhiều. Ví dụ: trong update_object_term_cacheđó có 7 lồng nhauforeach ... nếu bạn có nhiều phân loại và số lượng bài đăng trên mỗi trang cao, điều này không hiệu quả lắm.

Về những WP_Querytranh luận đó, cuối cùng

Những gì 'update_post_meta_cache''update_post_term_cache'làm khi được đặt falselà ngăn WordPress cập nhật bộ đệm cho các trường tùy chỉnh và phân loại tương ứng.

Trong trường hợp đó, lần đầu tiên một trường tùy chỉnh hoặc phân loại được truy vấn, một truy vấn cơ sở dữ liệu được kích hoạt và dữ liệu được lưu trữ.

Nó có đáng để gặp rắc rối?

Như thường lệ, câu trả lời là tùy thuộc . Hầu hết thời gian để đặt các giá trị đó thành false, là một lựa chọn tốt, bởi vì nó ngăn chặn các truy vấn cơ sở dữ liệu và xử lý không cần thiết nếu không cần thiết và bộ đệm được cập nhật dù sao là điều khoản trường / phân loại tùy chỉnh lần đầu tiên được yêu cầu.

Tuy nhiên, nếu bạn định gọi, dù chỉ một lần, get_post_meta()trong vòng lặp và bạn sẽ gọi get_the_terms()cho tất cả (hoặc hầu hết) các phân loại được hỗ trợ bởi các bài đăng, thì cập nhật bộ đệm được kích hoạt bằng mọi cách và có thể không có lợi ích thực sự nào trên thiết lập các đối số truy vấn thành false.


Khéo léo! Như mọi khi cái nhìn sâu sắc của bạn luôn được đánh giá cao GM. Transents sẽ được coi là "bộ nhớ cache liên tục"? Vì vậy, để đi xa hơn, trong WP_Query, lý do wp_reset_postdata()là để đặt lại global $postvà đặt lại Bộ đệm đối tượng? Có vẻ như nếu tôi đã thực hiện một WP_Query tùy chỉnh, nó sẽ tạo một đối tượng được lưu trong bộ nhớ cache mới nhưng việc đặt lại nó cũng sẽ phải yêu cầu để có được bộ đệm ban đầu. Hoặc có lẽ tôi đang đi quá xa trong bối cảnh của câu hỏi này.
Howdy_McGee

1
@Howdy_McGee Đối tượng bộ đệm và đối tượng bài không liên quan. Vì vậy, wp_reset_postdata()không làm gì liên quan đến bộ đệm đối tượng. wp_reset_postdata()chỉ đặt lại đối tượng bài đăng toàn cầu, đó là một biến toàn cục khác, không bao giờ được lưu trong bộ nhớ cache ... Transents là một thứ lai: khi bạn đã cài đặt một số bộ đệm cache liên tục, hãy sử dụng tạm thời, nhưng nếu bạn không có plugin bộ nhớ cache liên tục, thì tạm thời sử dụng cơ sở dữ liệu.
gmazzap

Ah, tôi chỉ bám vào global variablekhái niệm và cho rằng đó là vật thể global $posttoàn cầu $wp_query, cảm ơn vì đã làm rõ!
Howdy_McGee

Trên một sidenote , fields => 'ids'đặt cả bộ đệm vào false. Tôi cho rằng nó có ý nghĩa rằng
Bộ đệm

3

Điểm quan tâm chính ở đây là update_post_cacheschức năng. Nó được gọi sau khi WP_Query nhận được tất cả các bài đăng từ DB. Thông thường, lý do bạn muốn các bài đăng ở vị trí đầu tiên là hiển thị chúng, thường có nghĩa là hiển thị các thuật ngữ và thứ gì đó dựa trên siêu dữ liệu, do đó WP_Query cũng sẽ truy vấn DB theo mặc định cho dữ liệu meta và thuật ngữ liên quan đến các bài đăng được trả về và lưu nó vào bộ đệm *. Thông tin này không có sẵn rõ ràng trong dữ liệu được trả về từ WP_Query, nhưng khi bạn sẽ gọi các API có liên quan để lấy thuật ngữ và thông tin meta của một bài đăng cụ thể, nó sẽ có sẵn trong bộ nhớ và sẽ không cần phải gửi mới truy vấn DB.

Điều này cho phép wordpress giảm chi phí liên quan đến việc gửi yêu cầu đến DB bằng cách chỉ gửi một yêu cầu để nhận thông tin cho tất cả các bài đăng thay vì gửi yêu cầu cho mỗi bài đăng.

Ngay bây giờ tôi không thể tìm thấy bất kỳ ví dụ không tầm thường nào về việc khi nào bạn sẽ không muốn bộ đệm cập nhật, nhưng một ví dụ tầm thường có thể là nếu bạn chỉ muốn một danh sách các tiêu đề của tất cả các bài đăng. Cho rằng bạn không cần dữ liệu hạn hoặc meta.

* bộ đệm - Quan trọng nhất ở đây là bộ đệm dựa trên bộ nhớ trong đó WP lưu trữ tất cả mọi thứ mà nó nhận được từ DB ngay cả khi không có bất kỳ plugin bộ nhớ đệm đối tượng nào hoạt động. Rõ ràng khi bạn có bộ nhớ đệm đối tượng, thông tin cũng sẽ được lưu trữ ở đó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.