WordPress, varsayılan olarak, "Nesne Önbelleğe Alma" biçimini oluşturur, ancak kullanım ömrü yalnızca bir sayfa yüklenir.
Seçenekler aslında bunun gerçekten güzel bir örneği. Bu cevabı kontrol etDaha fazla bilgi için göz . Özet:
- Bir sayfa başlar
- Tüm seçenekler basit bir şekilde yüklenir
SELECT option_name, option_value from $wpdb->options
açıklamada
- Bu seçenekler için müteakip talepler (örneğin
get_option
, WP önbellek API'si ile depolandıklarından, veritabanına asla vurulmaması gereken bir çağrı) .
Seçenekler her zaman veritabanında "yaşar" ve orada her zaman ısrar edilir - bu onların "kurallı" kaynağıdır. Bununla birlikte, seçenekler nesne önbelleğine yüklenir, bu nedenle bir seçenek isteğinde,% 99'luk bir isteğin veritabanına ulaşma şansı yoktur.
Geçici olaylar biraz farklı.
WordPress bir ile önbellek api yerine sağlar açılan içinde bir dosya sizin doğrudan yerleştirilen alır - wp-content
klasörde. Kendi önbelleğinizi oluşturursanız ya da mevcut bir eklentiyi kullanıyorsanız , nesne önbelleğini tek sayfadan daha uzun süre devam ettirebilirsiniz. Bunu yaptığınızda, geçici olaylar biraz değişiyor.
set_transient
Fonksiyonuna bir göz atalım 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;
}
Hmmm $_wp_using_ext_object_cache
? Doğruysa, WordPress geçici depolamak için veritabanı yerine nesne önbelleğini kullanır . Peki bu nasıl gerçek oldu? WP'nin kendi önbellek API'sini nasıl kurduğunu keşfetme zamanı.
WordPress'in önyükleme işlemi için çok önemli olan hemen hemen her şeyi wp-load.php
veya her birini izleyebilirsiniz wp-settings.php
. Bizim önbelleğimizde ilgili bazı satırlar var wp-settings.php
.
// Start the WordPress object cache, or an external object cache if the drop-in is present.
wp_start_object_cache();
Yukarıdan çıkan o şeyi hatırlıyor musun? En az bir bakalım wp_start_object_cache
içinde 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' ) );
}
}
Fonksiyonun ilgili çizgileri (bununla ilgili olanlar $_wp_using_ext_object_cache
geçici durumların nasıl depolandığını değiştirir).
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;
}
eğer object-cache.php
içerik dizininde exist o dahil ve WP harici, Kalıcı önbelleği kullandığınız varsayılmıştır alır - bu ayarlar $_wp_using_ext_object_cache
true.
Harici bir nesne kullanıyorsanız, geçicibellekler önbellek kullanır. Bu seçenek ne zaman geçici seçeneklere karşı kullanılacağı sorusunu gündeme getirmektedir.
Basit. Süresiz olarak devam etmek için veriye ihtiyacınız varsa, seçenekleri kullanın. Önbelleklenirler, ancak kanonik kaynakları veritabanıdır ve bir kullanıcı açıkça talep etmediği sürece asla kaybolmazlar.
Belirli bir süre boyunca depolanması gereken, ancak belirli bir ömür boyu kullanım geçici sürelerinin ötesinde kalması gerekmeyen veriler için. Dahili olarak WP, harici, kalıcı bir nesne önbelleği kullanmaya çalışacak, aksi takdirde veriler seçenekler tablosuna girecek ve süresi dolduğunda WordPress'in 'psuedo-cron' u yoluyla çöp toplanacaktır .
Diğer bazı endişeler / sorular:
- Bir ton çağrı yapmak sorun olur
get_option
mu? Muhtemelen. Baştaki bir işleve çağrı yaparlar, ancak muhtemelen veritabanına çarpmaz. Veri tabanı yükü, web uygulaması ölçeklenebilirliği konusunda genellikle tercih ettiğiniz dilde sayfa üretme işinden daha büyük bir endişe kaynağıdır.
- Önbellek API'sine göre geçici işlemleri kullanmayı nasıl bilebilirim? Verilerin belirli bir süre boyunca devam etmesini beklerseniz, geçici API'yi kullanın. Verilerin devam edip etmediği önemli değilse (örneğin, verilerin hesaplanması / alınması uzun sürmez, ancak sayfa başına bir defadan fazla olmamalıdır) önbellek API'sini kullanın.
- Tüm seçenekler her sayfa görünümünde gerçekten önbelleğe alınmış mı? Şart değil.
add_option
Sonuncusuyla çağırırsanız , isteğe bağlı argüman no
otomatik olarak yüklenmediklerinden. Bununla birlikte, bir kez onları bir kez getirdiğinizde, önbelleğe girerler ve sonraki çağrılar veritabanına çarpmaz.