โดยค่าเริ่มต้น WordPress ทำรูปแบบของ "การแคชวัตถุ" แต่อายุการใช้งานของมันนั้นเป็นเพียงการโหลดหน้าเดียว
ตัวเลือกเป็นตัวอย่างที่ดีของเรื่องนี้ ลองอ่านคำตอบนี้สำหรับข้อมูลเพิ่มเติม สรุป:
- หน้าเริ่มต้น
- ตัวเลือกทั้งหมดจะถูกโหลดด้วย
SELECT option_name, option_value from $wpdb->options
คำสั่งง่ายๆ
- คำขอครั้งต่อ ๆ มาสำหรับตัวเลือกเหล่านั้น (เช่นการเรียกใช้เพื่อ
get_option
ไม่ให้เข้าถึงฐานข้อมูลเนื่องจากจะถูกจัดเก็บด้วย WP cache API
ตัวเลือกมักจะ "สด" ในฐานข้อมูลและจะคงอยู่ตลอดเวลานั่นคือแหล่ง "ยอมรับ" ของพวกเขา ที่กล่าวว่ามีการโหลดตัวเลือกลงในแคชวัตถุดังนั้นเมื่อคุณขอตัวเลือกมีโอกาส 99% ที่คำขอจะไม่ตีฐานข้อมูล
ชั่วครู่แตกต่างกันเล็กน้อย
WordPress ช่วยให้คุณสามารถแทนที่แคช api ด้วยดรอปอิน - ไฟล์ที่วางโดยตรงในwp-content
โฟลเดอร์ของคุณ หากคุณสร้างแคชของคุณเองหรือใช้ปลั๊กอินที่มีอยู่ คุณสามารถทำให้แคชวัตถุยังคงอยู่นานกว่าการโหลดหน้าเดียว เมื่อคุณทำเช่นนั้นชั่วคราวเปลี่ยนเล็กน้อย
ลองดูที่set_transient
ฟังก์ชั่น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;
}
อืมม$_wp_using_ext_object_cache
? หากเป็นจริง WordPress จะใช้แคชวัตถุแทนฐานข้อมูลเพื่อเก็บข้อมูลชั่วคราว ดังนั้นวิธีการที่ได้รับการตั้งค่าเป็นจริงได้อย่างไร ได้เวลาสำรวจว่า WP ตั้งค่าแคช API ของตัวเองอย่างไร
คุณสามารถติดตามเกือบทุกอย่างไปยังwp-load.php
หรือwp-settings.php
- ซึ่งทั้งสองอย่างนี้มีความสำคัญต่อกระบวนการบูทสแตรปของ WordPress wp-settings.php
ในแคชของเรามีบางสายที่เกี่ยวข้องใน
// Start the WordPress object cache, or an external object cache if the drop-in is present.
wp_start_object_cache();
จำไว้ว่าสิ่งที่ลดลงจากด้านบน? ลองมาดูที่ในwp_start_object_cache
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' ) );
}
}
บรรทัดที่เกี่ยวข้องของฟังก์ชัน (บรรทัดที่เกี่ยวข้องกับการ$_wp_using_ext_object_cache
เปลี่ยนแปลงวิธีการเก็บชั่วคราว)
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;
}
หากobject-cache.php
มีอยู่ในไดเรกทอรีเนื้อหาของคุณมันจะถูกรวมเข้าด้วยกันและ WP จะถือว่าคุณกำลังใช้แคชภายนอกที่คงอยู่ซึ่งตั้งค่า$_wp_using_ext_object_cache
เป็นจริง
หากคุณกำลังใช้แคชวัตถุชั่วคราวจะใช้มันชั่วคราว ซึ่งจะทำให้เกิดคำถามว่าเมื่อใดจึงควรใช้ตัวเลือกเทียบกับสภาวะชั่วคราว
ง่าย หากคุณต้องการข้อมูลเพื่อคงอยู่อย่างไม่มีกำหนดใช้ตัวเลือก พวกเขาได้รับ "แคช" แต่แหล่งที่เป็นที่ยอมรับของพวกเขาคือฐานข้อมูลและพวกเขาจะไม่หายไปนอกเสียจากว่าผู้ใช้ร้องขออย่างชัดเจน
สำหรับข้อมูลที่ควรเก็บไว้ตามระยะเวลาที่กำหนด แต่ไม่จำเป็นต้องคงอยู่เกินกว่าอายุการใช้งานที่กำหนด ภายใน WP จะพยายามใช้แคชวัตถุภายนอกที่คงอยู่หากข้อมูลสามารถเข้าไปในตารางตัวเลือกและรับขยะที่เก็บรวบรวมผ่านทางpsuedo-cron ของ WordPressเมื่อหมดอายุ
ข้อสงสัย / คำถามอื่น ๆ :
- มันโอเคที่จะโทรมาหลายสาย
get_option
หรือไม่? อาจ. พวกเขาเรียกใช้ค่าใช้จ่ายของฟังก์ชั่น แต่มันอาจจะไม่ตีฐานข้อมูล การโหลดฐานข้อมูลมักเกี่ยวข้องกับความสามารถในการปรับขนาดของเว็บแอ็พพลิเคชันได้ดีกว่าภาษาที่คุณเลือกจะสร้างหน้าขึ้นมา
- ฉันจะทราบได้อย่างไรว่าใช้ชั่วคราวกับ Cache API หากคุณคาดว่าข้อมูลจะคงอยู่ในช่วงเวลาที่กำหนดให้ใช้ transient API หากไม่สำคัญว่าข้อมูลยังคงอยู่ (เช่นใช้เวลาไม่นานในการคำนวณ / ดึงข้อมูล แต่ไม่ควรเกิดขึ้นมากกว่าหนึ่งครั้งต่อการโหลดหน้าเว็บ) ใช้แคช API
- ตัวเลือกทั้งหมดจะถูกแคชจริง ๆ ในทุก ๆ pageload หรือไม่? ไม่จำเป็น. หากคุณโทร
add_option
ด้วยอาร์กิวเมนต์ตัวสุดท้ายตัวเลือกno
นั้นจะไม่ถูกโหลดอัตโนมัติ ที่กล่าวว่าเมื่อคุณดึงข้อมูลพวกเขาครั้งเดียวพวกเขาเข้าไปในแคชและการโทรที่ตามมาจะไม่กระทบกับฐานข้อมูล