WP CLI ile WordPress Performans Profilleme ve Analiz: wp profile Kullanım Kılavuzu

WordPress siteniz yavaşlıyor ama nedenini bir türlü bulamıyor musunuz? Sorunu tahmin etmeye çalışmak yerine ölçmek çok daha mantıklı. İşte tam bu noktada wp profile devreye giriyor. WP-CLI’nin bu güçlü eklentisi, WordPress’in her adımda ne kadar zaman harcadığını, hangi hook’ların sistemi yavaşlattığını ve hangi veritabanı sorgularının kaynak tükettiğini milisaniye hassasiyetiyle ortaya koyuyor.

wp profile Nedir ve Neden Kullanmalısınız?

wp profile, WP-CLI için geliştirilmiş bir performans profilleme aracıdır. Resmi adı wp-cli/profile-command olan bu eklenti, WordPress’in bootstrap sürecini, hook’ları ve stage’leri ayrıntılı şekilde analiz etmenizi sağlar. Standart bir performans testi aracından farkı şu: doğrudan WordPress’in içinden çalışır, tarayıcı bağımsızdır ve sunucu tarafındaki gerçek maliyeti ölçer.

Bir sysadmin olarak benim için en büyük avantajı şu: müşteri “site yavaş” dediğinde artık “hangi plugin acaba?” diye tahmin yürütmüyorum. Komutu çalıştırıyorum, veriyi okuyorum, sorunu tespit ediyorum.

Kurulum

wp profile WP-CLI’ye dahil gelmez, ayrıca yüklemeniz gerekir:

wp package install wp-cli/profile-command

Kurulumu doğrulamak için:

wp package list

Listede wp-cli/profile-command görüyorsanız hazırsınız demektir.

Temel Kullanım: Stage Profilleme

wp profile komutunun en temel kullanımı WordPress’in yüklenme aşamalarını (stage) analiz etmektir. WordPress başlangıçta birkaç kritik aşamadan geçer: bootstrap, main_query, template. Her birinin ne kadar sürdüğünü görmek için:

wp profile stage --url=https://siteadi.com

Bu komut çıktısında şunları göreceksiniz:

  • stage: Analiz edilen aşamanın adı
  • time: O aşamanın toplam süresi (saniye)
  • query_count: Bu aşamada çalışan veritabanı sorgu sayısı
  • query_time: Veritabanı sorgularının toplam süresi
  • cache_hits: Object cache isabet sayısı
  • cache_misses: Object cache ıskalama sayısı
  • hook_count: Tetiklenen hook sayısı
  • request_count: Yapılan HTTP istek sayısı

Örnek bir çıktıya bakıldığında, bootstrap aşamasının 1.2 saniye sürdüğü ama main_query’nin sadece 0.05 saniye aldığı görülüyorsa, sorunun büyük ihtimalle plugin yüklenme sürecinde olduğunu anlarsınız.

Belirli Bir Aşamayı Derinlemesine İnceleme

Bir aşamanın içinde ne olduğunu görmek için --focus parametresini kullanırsınız:

wp profile stage --url=https://siteadi.com --focus=bootstrap

Bu size bootstrap aşamasındaki tüm hook’ları ve her birinin aldığı süreyi gösterir. Artık “plugins_loaded hook’unda 800ms gidiyor, neden?” sorusunu sorabilirsiniz.

Hook Profilleme: Asıl Derinlik Burası

Hook profilleme, performans analizinin en değerli kısmıdır. WordPress neredeyse her işlemi hook’lar üzerinden yapar ve herhangi bir hook’un yavaş çalışması tüm sayfayı etkiler.

wp profile hook --url=https://siteadi.com

Bu komut tüm hook’ları listeler ve her birinin maliyetini gösterir. Ama liste çok uzun olabilir. Sadece yavaş olanları görmek için --spotlight parametresini kullanın:

wp profile hook --url=https://siteadi.com --spotlight

–spotlight parametresi, boş veya sıfır değerli satırları gizler ve sadece gerçek aktivite olan hook’ları gösterir. Yüzlerce satır yerine gerçekten önemli olan 20-30 satırla muhatap olursunuz.

Belirli Bir Hook’u Detaylı İnceleme

Diyelim ki wp_loaded hook’unun 600ms sürdüğünü gördünüz. Bu hook’ta tam olarak ne çalışıyor?

wp profile hook wp_loaded --url=https://siteadi.com

Bu çıktıda artık o hook’a bağlı tüm callback fonksiyonlarını, her birinin hangi dosyadan geldiğini ve ne kadar sürdüğünü göreceksiniz. Artık “XYZ Plugin’in wp_loaded callback’i 550ms alıyor” gibi somut bir bilgiye sahip olursunuz.

Gerçek Dünya Senaryosu 1: Yavaş WooCommerce Sitesi

Bir e-ticaret müşterim vardı, ürün sayfaları 4-5 saniye açılıyordu. Sunucu kaynakları yeterliydi, CDN kullanıyordu ama yine de yavaştı. İlk adım:

wp profile stage --url=https://magaza.com --allow-root

Çıktı incelendiğinde bootstrap aşamasının 3.8 saniye sürdüğü görüldü. Bu anormal. Main_query ve template aşamaları toplam 0.4 saniyeydi. Yani sorun kesinlikle plugin yüklenmesindeydi.

wp profile hook --url=https://magaza.com --focus=bootstrap --spotlight

Bu komut çalıştırıldığında plugins_loaded hook’unun 3.1 saniye tuttuğu ve içinde bir “inventory sync” plugin’inin callback fonksiyonunun 2.9 saniye harcadığı görüldü. Envanter senkronizasyon eklentisi, her sayfa yüklemesinde harici bir API’ye istek atıyordu. Çözüm: API çağrısını cron job’a taşımak ve sonuçları cache’lemek. Sayfa yükleme süresi 0.8 saniyeye düştü.

Gerçek Dünya Senaryosu 2: Admin Panel Yavaşlığı

Admin paneli yavaş olan sitelerde farklı bir yaklaşım gerekir çünkü URL parametresi kritik hale gelir:

wp profile stage --url=https://siteadi.com/wp-admin/edit.php --allow-root

Ya da belirli bir admin sayfası için:

wp profile hook --url="https://siteadi.com/wp-admin/edit.php?post_type=product" --spotlight

Bu örnekte bir müşterinin WooCommerce ürün listesi sayfası 8 saniye açılıyordu. Profilleme yapıldığında admin_init hook’unda çalışan bir stok yönetimi eklentisinin her üründeki özel alanları çekerek 847 ayrı veritabanı sorgusu ürettiği görüldü. Klasik N+1 sorgu problemi. Eklenti güncellenerek düzeltildi.

–fields Parametresiyle Çıktıyı Özelleştirme

Bazen tüm kolonlara ihtiyaç duymayabilirsiniz. Sadece zaman ve sorgu sayısına odaklanmak istiyorsanız:

wp profile stage --url=https://siteadi.com --fields=stage,time,query_count,query_time

Ya da cache performansını analiz etmek istiyorsanız:

wp profile stage --url=https://siteadi.com --fields=stage,time,cache_hits,cache_misses

Cache hit/miss oranına baktığınızda, cache_misses çok yüksekse object cache kurmanız (Redis veya Memcached) veya mevcut cache yapılandırmanızı gözden geçirmeniz gerekiyor demektir.

–format Parametresiyle Çıktıyı Yönlendirme

Profilleme sonuçlarını bir dosyaya kaydetmek veya başka araçlarla işlemek isteyebilirsiniz. --format parametresi bu konuda esneklik sağlar:

wp profile stage --url=https://siteadi.com --format=json > profil_raporu.json

CSV formatı da kullanılabilir, özellikle raporlama amaçlıysa:

wp profile hook --url=https://siteadi.com --spotlight --format=csv > hook_raporu.csv

Bu çıktıları daha sonra bir takım arkadaşınıza gönderebilir ya da belirli aralıklarla çalıştırıp performans değişimlerini takip edebilirsiniz.

Otomatik Profilleme: Cron ile Periyodik Analiz

Performans sorunları her zaman anlık değildir. Belirli saatlerde, belirli trafik yüklerinde ortaya çıkabilir. Bu durumda periyodik profilleme yapıp sonuçları loglamak mantıklıdır:

#!/bin/bash
TARIH=$(date +%Y%m%d_%H%M%S)
LOG_DIR="/var/log/wp-profile"
mkdir -p $LOG_DIR

wp profile stage --url=https://siteadi.com --format=json --allow-root 
  --path=/var/www/html > "$LOG_DIR/stage_$TARIH.json"

wp profile hook --url=https://siteadi.com --spotlight --format=json --allow-root 
  --path=/var/www/html > "$LOG_DIR/hook_$TARIH.json"

echo "Profilleme tamamlandi: $TARIH" >> "$LOG_DIR/profil.log"

Bu scripti crontab’a ekleyerek saatlik çalıştırabilirsiniz:

0 * * * * /usr/local/bin/wp-profiler.sh

Böylece gün içinde hangi saatlerde performansın düştüğünü, hangi hook’ların zaman içinde daha ağır hale geldiğini görebilirsiniz.

–quiet ve –debug Parametreleri

Betik tabanlı kullanımda --quiet parametresi gereksiz çıktıları engeller:

wp profile stage --url=https://siteadi.com --quiet --format=json

Tersine, bir şeyler ters gidiyorsa ve neden çalışmadığını anlamak istiyorsanız --debug kullanın:

wp profile stage --url=https://siteadi.com --debug

--debug çıktısı WP-CLI’nin arka planda ne yaptığını gösterir, özellikle farklı sunucu yapılandırmalarında neden hata aldığınızı anlamak için değerlidir.

Multisite Ortamında Kullanım

WordPress Multisite kurulumlarında her site ayrı ayrı profillenebilir:

wp profile stage --url=https://site1.network.com --allow-root
wp profile stage --url=https://site2.network.com --allow-root

Ya da --path ile birlikte kullanarak belirli bir WordPress kurulumunu hedef alabilirsiniz:

wp profile stage --url=https://siteadi.com --path=/var/www/wordpress --allow-root

Multisite’da bir sitenin diğerlerinden belirgin şekilde yavaş olduğu durumlar sıkça görülür. Bu genellikle o siteye özel bir eklentiden ya da aşırı meta veri birikiminden kaynaklanır.

Gerçek Dünya Senaryosu 3: Sayfalama Sorunu

Bir haber sitesinde arşiv sayfaları normal çalışırken 50. sayfadan itibaren aşırı yavaşlıyordu. Şüphe pre_get_posts hook’undaydı:

wp profile hook pre_get_posts --url="https://haberler.com/kategori/guncel/page/50/" --allow-root

Sonuçta pre_get_posts callback’lerinden birinin, her çalışmada tüm kategorileri veritabanından çektiği ve bu sorgunun 50. sayfada onlarca kez tekrarlandığı ortaya çıktı. Çözüm basitti: sonuçları transient cache’e almak. Kod şuna benziyordu düzeltme sonrası:

# Düzeltme yapıldıktan sonra doğrulama için
wp profile hook pre_get_posts --url="https://haberler.com/kategori/guncel/page/50/" --spotlight

Cache devreye girdikten sonra query_count 180’den 12’ye, sayfa yüklenme süresi 6 saniyeden 0.9 saniyeye indi.

Plugin Karşılaştırma Analizi

Bazen iki farklı plugin arasında seçim yapmanız gerekir. wp profile bu karar sürecinde objektif veri sağlar. Önce birinci plugin aktifken profil alın:

wp plugin activate plugin-a
wp profile stage --url=https://siteadi.com --format=json > plugin_a_profil.json
wp plugin deactivate plugin-a

Sonra ikinci plugin ile:

wp plugin activate plugin-b
wp profile stage --url=https://siteadi.com --format=json > plugin_b_profil.json
wp plugin deactivate plugin-b

İki JSON dosyasını karşılaştırdığınızda hangi plugin’in daha az kaynak tükettiğini somut veriye dayalı olarak görebilirsiniz. “Şu plugin daha iyi” lafını bırakın, sayılar konuşsun.

Dikkat Edilmesi Gereken Noktalar

wp profile kullanırken bazı pratik detaylara dikkat etmek gerekir:

  • Üretim ortamında dikkatli kullanın: Her profilleme komutu gerçek bir sayfa isteği tetikler. Yoğun trafik altında ek yük oluşturabilir. Tercihen düşük trafikli saatlerde çalıştırın.
  • Cache’i geçici olarak devre dışı bırakın: Object cache açıkken bazı sorunlar profilleme esnasında görünmeyebilir. Gerçek sorguları görmek için test esnasında cache’i devre dışı bırakmayı düşünün.
  • Birden fazla kez çalıştırın: Tek bir ölçüm yanıltıcı olabilir. Özellikle ilk çalıştırmada PHP opcode cache henüz ısınmamış olabilir. 3-5 kez çalıştırıp ortalamalara bakın.
  • URL parametresini doğru girin: Profilleme sonuçları URL’ye göre değişir. Ana sayfa ile kategori sayfası farklı hook’lar tetikler.
  • –allow-root: Sunucunuzda root olarak çalışıyorsanız bu parametreyi eklemeniz gerekir. Güvenlik açısından her zaman normal kullanıcıyla çalışmayı tercih edin ama zorunluluk halinde bu parametre var.

WP-CLI ile Bütünleşik Performans Analizi

wp profile tek başına güçlüdür ama diğer WP-CLI komutlarıyla birleşince daha da etkili olur. Şüpheli bir plugin tespit ettiğinizde hemen aktiflik durumunu kontrol edebilirsiniz:

wp plugin list --status=active --format=table

Veritabanı sorgularının aşırı yüksek olduğunu gördüğünüzde veritabanı istatistiklerine bakabilirsiniz:

wp db size --tables

Cache durumunu kontrol etmek için:

wp cache type

Object cache yoksa “non-persistent” döner ve bu durumda Redis ya da Memcached kurmanızın profilleme sonuçlarını dramatik şekilde iyileştireceğini beklemelisiniz.

Performans Regresyon Testi

Yeni bir plugin kurmadan ya da major bir güncelleme yapmadan önce mevcut profili kaydedin, değişikliği yapın, tekrar profilleme yapın ve karşılaştırın. Bu basit süreç çok büyük sorunları önceden engeller:

# Güncelleme öncesi
wp profile stage --url=https://siteadi.com --format=json > onceki_profil.json

# Güncelleme yap
wp plugin update --all

# Güncelleme sonrası
wp profile stage --url=https://siteadi.com --format=json > sonraki_profil.json

# Farkları karşılaştır
diff onceki_profil.json sonraki_profil.json

Bu yaklaşım özellikle WooCommerce güncellemelerinde hayat kurtarıcıdır. WooCommerce majör sürüm geçişlerinde bazen belirli hook’larda ciddi performans değişiklikleri yaşanır ve bunu önceden tespit etmek çok değerlidir.

Sonuç

wp profile, sysadmin’lerin performans sorunlarına yaklaşımını köklü biçimde değiştiren bir araç. Artık “şu plugin yavaşlatıyor olabilir” yerine “şu plugin’in bu callback’i her istekte 400ms alıyor, şuraya cache ekleyelim” diyebiliyorsunuz. Bu fark, hem müşteri ilişkileri hem de çözüm süresi açısından muazzam.

Kurulumu beş dakika, temel kullanımı öğrenmek bir saat, ama değeri yıllarca devam ediyor. Eğer düzenli WordPress site yönetimi yapıyorsanız bu araç olmadan çalışmak, gözleri bağlı araba sürmek gibi. Evet, bazen çalışıyor ama riski gereksiz yere yüksek.

Bootstrap aşamasından başlayın, hook’lara inin, spotlight ile sadece gerçek aktiviteyi görün ve JSON çıktılarını düzenli kaydedin. Zamanla sitenizin “normal” profilini öğrenirsiniz ve bir şeyler yanlış gittiğinde bunu anında fark edersiniz. Performans yönetimi reaktif olmaktan çıkar, proaktif bir süreç haline gelir.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir