Theo mặc định, WordPress thực hiện một dạng "Bộ nhớ đệm đối tượng" nhưng thời gian tồn tại của nó chỉ là một trang tải duy nhất.
Các tùy chọn thực sự là một ví dụ thực sự tốt về điều này. Kiểm tra câu trả lời này để biết thêm. Tóm tắt:
- Một trang bắt đầu
- Tất cả các tùy chọn được tải với một
SELECT option_name, option_value from $wpdb->options
tuyên bố đơn giản
- Các yêu cầu tiếp theo cho các tùy chọn đó (ví dụ: một cuộc gọi
get_option
không bao giờ nhấn vào cơ sở dữ liệu vì chúng được lưu trữ với API bộ đệm WP.
Các tùy chọn luôn "sống" trong cơ sở dữ liệu và luôn được duy trì ở đó - đó là nguồn "chính tắc" của chúng. Điều đó nói rằng, các tùy chọn được tải vào bộ đệm đối tượng để khi bạn yêu cầu một tùy chọn, có 99% khả năng yêu cầu đó sẽ không bao giờ đánh vào cơ sở dữ liệu.
Transents là một chút khác nhau.
WordPress cho phép bạn thay thế api bộ nhớ cache bằng trình đơn thả xuống - một tệp được đặt trực tiếp trong wp-content
thư mục của bạn . Nếu bạn tạo bộ đệm riêng của mình thả vào hoặc sử dụng một plugin hiện có , bạn có thể làm cho bộ đệm đối tượng tồn tại lâu hơn một lần tải trang. Khi bạn làm điều đó, tạm thời, thay đổi một chút.
Chúng ta hãy xem set_transient
chức năng trong wp-includes/option.php
.
<?php
/**
* Set/update the value of a transient.
*
* You do not need to serialize values. If the value needs to be serialized, then
* it will be serialized before it is set.
*
* @since 2.8.0
* @package WordPress
* @subpackage Transient
*
* @uses apply_filters() Calls 'pre_set_transient_$transient' hook to allow overwriting the
* transient value to be stored.
* @uses do_action() Calls 'set_transient_$transient' and 'setted_transient' hooks on success.
*
* @param string $transient Transient name. Expected to not be SQL-escaped.
* @param mixed $value Transient value. Expected to not be SQL-escaped.
* @param int $expiration Time until expiration in seconds, default 0
* @return bool False if value was not set and true if value was set.
*/
function set_transient( $transient, $value, $expiration = 0 ) {
global $_wp_using_ext_object_cache;
$value = apply_filters( 'pre_set_transient_' . $transient, $value );
if ( $_wp_using_ext_object_cache ) {
$result = wp_cache_set( $transient, $value, 'transient', $expiration );
} else {
$transient_timeout = '_transient_timeout_' . $transient;
$transient = '_transient_' . $transient;
if ( false === get_option( $transient ) ) {
$autoload = 'yes';
if ( $expiration ) {
$autoload = 'no';
add_option( $transient_timeout, time() + $expiration, '', 'no' );
}
$result = add_option( $transient, $value, '', $autoload );
} else {
if ( $expiration )
update_option( $transient_timeout, time() + $expiration );
$result = update_option( $transient, $value );
}
}
if ( $result ) {
do_action( 'set_transient_' . $transient );
do_action( 'setted_transient', $transient );
}
return $result;
}
Hừm $_wp_using_ext_object_cache
? Nếu đó là sự thật, WordPress sử dụng bộ đệm đối tượng thay vì cơ sở dữ liệu để lưu trữ quá độ. Vì vậy, làm thế nào mà được thiết lập thành đúng? Thời gian để khám phá cách WP thiết lập API bộ nhớ cache của riêng mình.
Bạn có thể theo dõi hầu hết mọi thứ wp-load.php
hoặc wp-settings.php
- cả hai đều quan trọng đối với quá trình bootstrap của WordPress. Trong bộ nhớ cache của chúng tôi, có một số dòng có liên quan wp-settings.php
.
// Start the WordPress object cache, or an external object cache if the drop-in is present.
wp_start_object_cache();
Hãy nhớ rằng thả trong điều từ trên? Chúng ta hãy xem xét wp_start_object_cache
trong wp-includes/load.php
.
<?php
/**
* Starts the WordPress object cache.
*
* If an object-cache.php file exists in the wp-content directory,
* it uses that drop-in as an external object cache.
*
* @access private
* @since 3.0.0
*/
function wp_start_object_cache() {
global $_wp_using_ext_object_cache, $blog_id;
$first_init = false;
if ( ! function_exists( 'wp_cache_init' ) ) {
if ( file_exists( WP_CONTENT_DIR . '/object-cache.php' ) ) {
require_once ( WP_CONTENT_DIR . '/object-cache.php' );
$_wp_using_ext_object_cache = true;
} else {
require_once ( ABSPATH . WPINC . '/cache.php' );
$_wp_using_ext_object_cache = false;
}
$first_init = true;
} else if ( !$_wp_using_ext_object_cache && file_exists( WP_CONTENT_DIR . '/object-cache.php' ) ) {
// Sometimes advanced-cache.php can load object-cache.php before it is loaded here.
// This breaks the function_exists check above and can result in $_wp_using_ext_object_cache
// being set incorrectly. Double check if an external cache exists.
$_wp_using_ext_object_cache = true;
}
// If cache supports reset, reset instead of init if already initialized.
// Reset signals to the cache that global IDs have changed and it may need to update keys
// and cleanup caches.
if ( ! $first_init && function_exists( 'wp_cache_switch_to_blog' ) )
wp_cache_switch_to_blog( $blog_id );
else
wp_cache_init();
if ( function_exists( 'wp_cache_add_global_groups' ) ) {
wp_cache_add_global_groups( array( 'users', 'userlogins', 'usermeta', 'user_meta', 'site-transient', 'site-options', 'site-lookup', 'blog-lookup', 'blog-details', 'rss', 'global-posts', 'blog-id-cache' ) );
wp_cache_add_non_persistent_groups( array( 'comment', 'counts', 'plugins' ) );
}
}
Các dòng có liên quan của hàm (những dòng liên quan đến $_wp_using_ext_object_cache
điều đó thay đổi cách lưu trữ quá độ).
if ( file_exists( WP_CONTENT_DIR . '/object-cache.php' ) ) {
require_once ( WP_CONTENT_DIR . '/object-cache.php' );
$_wp_using_ext_object_cache = true;
} else {
require_once ( ABSPATH . WPINC . '/cache.php' );
$_wp_using_ext_object_cache = false;
}
nếu object-cache.php
tồn tại trong thư mục nội dung của bạn, nó sẽ được bao gồm và WP giả định rằng bạn đang sử dụng bộ đệm ẩn bên ngoài, liên tục - nó được đặt $_wp_using_ext_object_cache
thành đúng.
Nếu bạn đang sử dụng một bộ đệm tạm thời đối tượng bên ngoài sẽ sử dụng nó. Điều này đưa ra câu hỏi khi nào nên sử dụng tùy chọn so với tạm thời.
Đơn giản. Nếu bạn cần dữ liệu để tồn tại vô thời hạn, hãy sử dụng các tùy chọn. Họ nhận được "lưu trữ", nhưng nguồn chính của họ là cơ sở dữ liệu và họ sẽ không bao giờ biến mất trừ khi người dùng yêu cầu rõ ràng.
Đối với dữ liệu nên được lưu trữ trong một khoảng thời gian đã đặt, nhưng không cần phải vượt quá thời gian sử dụng trọn đời được chỉ định. Trong nội bộ, WP sẽ cố gắng sử dụng bộ đệm đối tượng liên tục, bên ngoài nếu có thể dữ liệu sẽ đi vào bảng tùy chọn và nhận rác được thu thập thông qua psuedo-cron của WordPress khi chúng hết hạn.
Một số mối quan tâm / câu hỏi khác:
- Có thể thực hiện một tấn các cuộc gọi đến
get_option
? Có lẽ. Họ phải chịu một cuộc gọi đến chức năng, nhưng có khả năng nó sẽ không trúng cơ sở dữ liệu. Tải cơ sở dữ liệu thường là mối quan tâm lớn hơn về khả năng mở rộng ứng dụng web so với công việc mà ngôn ngữ bạn chọn tạo ra một trang.
- Làm cách nào để biết cách sử dụng tạm thời so với API Cache? Nếu bạn muốn dữ liệu tồn tại trong một khoảng thời gian đã đặt, hãy sử dụng API tạm thời. Nếu không có vấn đề gì nếu dữ liệu vẫn tồn tại (ví dụ: sẽ không mất nhiều thời gian để tính toán / tìm nạp dữ liệu, nhưng điều đó không nên xảy ra nhiều hơn một lần cho mỗi lần tải trang) sử dụng API bộ đệm.
- Có phải tất cả các tùy chọn thực sự được lưu trữ trên mỗi trang tải? Không cần thiết. Nếu bạn gọi
add_option
với đối số cuối cùng, tùy chọn vì no
chúng không được tự động tải. Điều đó nói rằng, một khi bạn tìm nạp chúng một lần, chúng sẽ vào bộ đệm và các cuộc gọi tiếp theo sẽ không vào cơ sở dữ liệu.