WordPress sorgularınızı hafifletmek adına eskiden bu yana çok sayıda makale yazmıştım. Ancak her öğrendiğim yeni metod ile daha farklı performans çıktısı sağladığım gerçeğini de buraya yazmadan edemeyeceğim. Şu sıralar bilindik bir projenin wordpress temasını optimize ediyorum. Aşırı kaynak tüketiminden dolayı Ahmet Orhan zor anlar yaşıyormuş ve durumu optimizasyon çözümü ile aşmak sürecindeyiz.

Bu esnada, değerli usta Fatih Hayrioğlu‘nun blogunun yeni yapısını değiştirmesine istinaden daha doyurucu optimizasyon araçları amaçlı araştırmalarım da devam ediyor elbet. Bu gün an itibarı ile, keşfi tamamladığım ve somutlaştırdığım ipucunu makaleleştirme kararı aldım. Orta düzey wordpress programcıları için çok şey ifade edeceğini düşündüğüm yazıyı okumanızı / faydalı olmasını umuyorum.

Thomas Griffen ‘ın yakın geçmişte yazdığı bir yazı ve SE üzerinden edindiğim bilgiler ile bana çok faydalı ipuçları veren Daniel Sachs‘a sonsuz teşekkürler.

Sorgumuzu hafifletmek adına önceleri hatırlarsınız, bu yazımda transient api metodunu açıklamıştım size. Bu ipucuna ek olarak , sorgularımızın daha minimize halini, get_posts için çağrılan değerleri kapatarak deneyeceğiz.

Örnek olarak ;

$Sorgu = get_posts( array( 'posts_per_page' => 1 ) );
yapılı sorgumuzu print ettiğimiz zaman bu $sorgu değişkeninin sorgu yapılan değerleri şu şekilde sonuç veriyor bize ;

Array
(
[0] => WP_Post Object
(
[ID] => 1
[post_author] => 1
[post_date] => 2012-09-25 21:44:47
[post_date_gmt] => 2012-09-25 20:44:47
[post_content] => Welcome to WordPress. This is your first post. Edit or delete it, then start blogging!
[post_title] => Hello world!
[post_excerpt] =>
[post_status] => publish
[comment_status] => open
[ping_status] => open
[post_password] =>
[post_name] => hello-world
[to_ping] =>
[pinged] =>
[post_modified] => 2012-10-16 17:22:34
[post_modified_gmt] => 2012-10-16 17:22:34
[post_content_filtered] =>
[post_parent] => 0
[guid] => http://localhost :8888/trunk/?p=1
[menu_order] => 0
[post_type] => post
[post_mime_type] =>
[comment_count] => 1
[filter] =>
)
)

24 farklı objeyi nitelemiş oluyoruz anlayacağınız. Dolayısı ile posts_per_page => 5 dediğimiz zaman ise 24×5 kez bu işlemi tekrarlamış oluyoruz. Sonuç olarak işin temelinde, bize sorgumuz için gerekecek ve ihtiyacımız olan ne varsa yalnızca onu almak, onu sorgulatmak en temel nedenimiz olmalı ki gereksiz değerleri (kullanmayacağımız için) fazladan yük etmeyelim.

$Sorgu = get_posts( array( 'posts_per_page' => 1, 'cache_results' => false ) );
$Sorgu değişkenimizi bu parametreler ile tanımladığımız zaman

[PHP]cache_results' => false

değeri ile, wp_cache aracılığı ile keşlenen kısımlar ile ilgilenmediğimizi belirtiyoruz. Akabinde aynı mantık ile hareket eden ;

'update_post_meta_cache' ve 'update_post_term_cache'
değerlerini de elbette false, konuma getirip, sonucumuzun (işlemin) süresine bakalım birlikte.

Cache edilen (belleklenen) sorgu ve belleklenmeyen sorgunun yüklenme süresi
function Poz_Belleklenmeyen_Sorgu() {
$Zamanlama = microtime( true );
$Sorgu = get_posts( array( 'posts_per_page' => -1 ) );
return number_format( microtime( true ) - $Zamanlama, 10 );
}

function Poz_Belleklenen_Sorgu() {
$Zamanlama = microtime( true );
$Sorgu = get_posts( array( 'posts_per_page' => -1, 'cache_results' => false ) );
return number_format( microtime( true ) - $Zamanlama, 10 );
}

Poz_Belleklenmeyen_Sorgu : 0.014947224
Poz_Belleklenen_Sorgu (‘cache_results’ değeri false yapılınca): 0.004860735
Aradaki fark: 0.010086489

Sonuç olarak farkın bariz belirginliği ufak sorgulu $değişken’ler için pek ihtiyaç olmasa da yüklü ve trafiği bol çalışmalar için gayet olması gerekendir.

SQL_CALC_FOUND_ROWS kullanımını iptal etmek
WordPress sayfalama metodu için SQL_CALC_FOUND_ROWS sql yapısını kullanıyor. Eğer sayfalama kullanmak istemiyorsak sorgumuzda boş yere sorgu yapmayı da elbetteki istemeyiz. Kullanımı;

$Sorgu = new WP_Query( array( 'posts_per_page' => 1, 'no_found_rows' => true ) );
Bu yapımızın da zaman değerlerini hemen çıktı alalım bakalım farkımız ne olacak;

function Sayfalamaile_Sorgu() {
$Zaman = microtime( true );
$Sorgu = new WP_Query( array( 'posts_per_page' => -1 ) );
return number_format( microtime( true ) - $Zaman, 10 );
}

function Sayfalamaolmdan_Sorgu() {
$Zaman = microtime( true );
$Sorgu = new WP_Query( array( 'posts_per_page' => -1, 'no_found_rows' => true ) );
return number_format( microtime( true ) - $Zaman, 10 );
}

Sayfalama ile sorgumuz: 0.015301085
Sayfalama olmadan sorgumuz: 0.014417219
Avantajımız: 0.000883865

Sonuç olarak performans bu şekilde indirgenebilir. Array dizi değişkeninde üstte gösterdiğim 24 farklı değeri almak yerine yalnızca ilgilendiklerimizi alabiliriz. Mesela bir örnek alarak konuyu toplayalım isterim ;

$Sorgu = get_posts( array( 'posts_per_page' => 1, 'fields' => 'ids' ) );
Burada post id’mizi almış olduk. Tekli değer çağrışımları için fields array parametresini kullanabiliriz.

Bir örnek yapmak gerekir ise;

$Poz = array(
'posts_per_page' => 5,
'orderby' => 'date',
'order' => 'DESC',
'no_found_rows' => true,
'update_post_term_cache' => false,
'update_post_meta_cache' => false,
);

query_posts( $Poz ); while ( have_posts() ) : the_post(); ?>



  • Ve çıktı sonrası bu yapıyı fonksiyonlaştırıp transient api ile kullandığınızda farkı sizlerde farkedeceksiniz.

    WordPress ile nice güzel projelere…

    Kaynak : http://www.fatihtoprak.com/wordpress-sorgularinizi-hafifletin-bellekleyin-ve-en-ust-duzey-performans-saglayin-ipucu-104.html

    Not: Konu ile alakalı yorumlarınızı blog üzerinden de eksik etmeyin lütfen.