Yüksek trafikli WordPress siteleri için Query Bellekleme yöntemleri
Malum, bu durum oldukça can sıkıcı. Ve herkes tam olarak neler hakkında önlem alması gerektiği konusunda bile net olarak fikir sahibi değil.
Çevrede dolanan şehir efsanelerine inanarak bir şekilde mevcut projelerini sallanmaktan emeklemeye kadar taşıyabiliyorlar. Düzgün kurgulanmadan yapılan basit WordPress loop yerleşimleri bile, bir temanın sayfa başı 70 ile 700 arası değişen sql sorguları yapmasına sebep olabiliyor.
Vaziyet bu kadar vahim olduktan sonra, artan trafikle paralel sunucu kaynaklarının tüketimi optimum seviyelere çıkınca, diğer sıkıntılı süreç başlamış oluyor. Barındırma hizmeti alınan servis sağlayıcı ile küfürleşen mi, kavga gürültü birbirine giren mi, ne arasanız var! Ama ordaki asıl mesele çalışmanın / projenin neden bu aşamadasize sıkıntı yaratıyor sorusuna verlemeyen doyurucu olmayan eksik cevaplarda.
Aslında tüm soruların en net ve tek bir yanıtı var.
WordPress veritabanı mimarisi gereği, oldukça stabil olarak kullanılabilecek şahane bir framework’dür. Ancak çöp gibi yazılan makarna gibi kodlar, sizin WordPress ile kötüye giden ilişkilerinizein başlamasına sebep olur ! Lütfen net cevap alacağınız yazılım geliştiricilerinin hazırladığı temaları kullanmaya dikkat edin, çünkü çevrede inanılmaz WordPress geliştiricisi var (!) Neredeyse WordPress kullanımı kadar WordPress geliştiricisi var : )
Sistem neden ağırlaşıyor
Sistem, tek bir sql query ´$wpdb´ sınıfı kullanılmadan dünyalarca ´while´ ve ´foreach´ döngüsünde çalışmaya çalıştığı için çok sayıda sorgu yapılmış oluyor veritabanı ile sisteminiz arasında, oysaki tek bir sql query ile siz son 10 yazıyı alabilirsiniz misal ; )
Örnekler
Son 10 yazıyı (yayınlanmış) şu şekilde tek bir sql sorgusu ile alabilirsiniz.
global $wpdb;
$prepared = $wpdb->prepare(“SELECT ID, post_title FROM $wpdb->posts WHERE `post_status` = ‘publish’ AND `post_type` = ‘post’ AND LIMIT 10 );
Hatta bu sorgunuzu, transient_api ile de bellekleyebilirsiniz.
<?php
$transName = 'son-on-yazi';
$cacheTime = 10; //Zaman aralığı
if(false === ($prepared = get_transient($transName) ) ){
global $wpdb;
$prepared = $wpdb->prepare("SELECT ID, post_title FROM $wpdb->posts WHERE `post_status` = 'publish' AND `post_type` = 'post' AND LIMIT 10 );
set_transient($transName, $prepared, 60 * $cacheTime);
}
?>
Sorgunuz ne kadar sıkıntılı olursa olsun, ne kadar INNER_JOIN li ve subqueryli olursa olsun, transient_api sayesinde tamamı tek satır sorgu haline gelmiş oluyor.
Daha fazla detay için : https://codex.wordpress.org/Transients_API
Hatta transient_api kullanımı ile alakalı da yakın gelecekte örnekleri pekiştirmek olası.