WP CLI ile WordPress Transient Yönetimi: Geçici Veri Kontrolü

WordPress ile ciddi ölçekte çalışan her sysadmin er ya da geç şu soruyla karşılaşır: “Bu site neden bu kadar yavaş?” Çoğu zaman cevap veritabanında gizlidir. Transient’lar, WordPress’in geçici veri saklamak için kullandığı mekanizmadır ve yanlış yönetildiğinde hem performans kabusu hem de hata kaynağı olabilir. WP-CLI ile bu transient’ları komut satırından yönetmek, özellikle production ortamlarında GUI olmadan çalışırken hayat kurtarıcıdır.

WP Transient Nedir?

WordPress transient API’si, geçici verileri belirli bir süre için önbelleklemek amacıyla tasarlanmıştır. Temel mantık şudur: bir işlemi her seferinde tekrarlamak yerine sonucunu bir süreliğine saklarsın, aynı istek geldiğinde hesaplamak yerine önbellekten okursun.

Transient’lar varsayılan olarak WordPress veritabanının wp_options tablosunda saklanır. Her transient için üç kayıt oluşur:

  • _transient_{key}: Asıl veri
  • _transient_timeout_{key}: Son kullanma zamanı (Unix timestamp)
  • _site_transient_{key}: Çok siteli (multisite) kurulumlar için site genelinde geçerli versiyon

Eğer sisteminizde Redis veya Memcached gibi bir object cache çözümü varsa, transient’lar veritabanı yerine bu sistemlerde saklanır. Bu durum hem performansı artırır hem de WP-CLI ile yönetimde bazı farklılıklar yaratır, bunu ilerleyen bölümlerde ele alacağız.

Neden WP-CLI Kullanmalısın?

Basit bir düşünce deneyi yapalım: Production’da bir eklenti güncellemesi yaptın ve site bozuldu. Yönetici paneliine giremiyorsun çünkü eklenti bir transient’ı bozuk formatta bıraktı. SSH erişimin var ama tarayıcı üzerinden hiçbir şey yapamıyorsun. İşte bu noktada WP-CLI olmak, arabasız çölde kalmak gibi bir şeydir.

WP-CLI transient komutları ile:

  • Tüm transient’ları listeleyebilirsin
  • Belirli bir transient’ı okuyabilirsin
  • Manuel olarak transient oluşturabilirsin
  • Süresi dolmuş veya belirli transient’ları silebilirsin
  • Tüm transient önbelleğini temizleyebilirsin

Temel WP-CLI Transient Komutları

Transient Listesi Görüntüleme

wp transient list

Bu komut, veritabanındaki tüm transient’ları listeler. Ancak yüklü bir sitede bu çıktı devasa olabilir. Daha kullanışlı versiyonları şöyle:

# Sadece ilk 20 transient'ı göster
wp transient list --per-page=20

# Belirli bir isimle eşleşen transient'ları filtrele
wp transient list --search="woocommerce*"

# Süresi dolmuş transient'ları listele
wp transient list --expired

# Sadece site transient'larını listele (multisite)
wp transient list --network

# Çıktıyı JSON formatında al
wp transient list --format=json

--search: Wildcard ile arama yapar, * karakteri kullanabilirsin. --expired: Sadece süresi dolmuş transient’ları gösterir. --network: Multisite kurulumlarında site genelindeki transient’ları listeler. --per-page: Sayfa başına sonuç sayısını belirler. --format: Çıktı formatını belirler, table, json, csv, yaml seçenekleri mevcuttur.

Transient Değeri Okuma

# Bir transient'ın değerini oku
wp transient get my_custom_transient

# Okunaklı formatta göster
wp transient get woocommerce_helper_updates --format=json

Eğer transient mevcut değilse ya da süresi dolmuşsa WP-CLI geriye boş çıktı döner. Bu davranışı script’lerde kontrol etmek için şu yaklaşımı kullanabilirsin:

VALUE=$(wp transient get my_transient 2>&1)
if [ -z "$VALUE" ]; then
    echo "Transient mevcut değil veya süresi dolmuş"
else
    echo "Transient değeri: $VALUE"
fi

Transient Oluşturma ve Güncelleme

# Basit bir transient oluştur (3600 saniye = 1 saat)
wp transient set my_custom_key "merhaba dunya" 3600

# Site genelinde transient oluştur (multisite)
wp transient set global_notice "Sistem bakımda" 7200 --network

# Süresiz transient oluştur (dikkatli kullan!)
wp transient set permanent_cache "kalici veri" 0

Süresiz transient’lar (expiration = 0) veritabanında sonsuza kadar kalır ve otomatik temizlenmez. Production’da bu tip transient’ları kullanmaktan kaçın, aksi hâlde zamanla veritabanın şişer.

Transient Silme

# Tek bir transient'ı sil
wp transient delete my_custom_key

# Tüm süresi dolmuş transient'ları sil
wp transient delete --expired

# TÜM transient'ları sil (dikkatli!)
wp transient delete --all

# Site genelindeki transient'ları sil (multisite)
wp transient delete --all --network

--all parametresini üretim ortamında çalıştırmadan önce iki kez düşün. Yüksek trafikli bir sitede tüm transient’ları aynı anda silmek, “cache stampede” denilen duruma yol açabilir; tüm istekler aynı anda veritabanına vurur ve sistem çöker.

Gerçek Dünya Senaryoları

Senaryo 1: WooCommerce Sonrası Temizlik

WooCommerce büyük miktarda transient üretir. Özellikle ürün güncellemelerinden, fiyat değişikliklerinden veya eklenti güncellemelerinden sonra bayat cache verileri sorun çıkarabilir. Şu durum çok yaygındır: fiyatları güncelledin ama müşteriler hâlâ eski fiyatları görüyor.

# WooCommerce ile ilgili tüm transient'ları listele
wp transient list --search="wc_*" --format=table

# WooCommerce transient'larını toplu sil
wp transient delete --all

# Ardından WooCommerce cache'ini yeniden oluşturmak için
wp wc tool run clear_transients --user=admin

Daha surgical bir yaklaşım için belirli WooCommerce transient’larını hedefleyebilirsin:

# Ürün sorgu cache'ini temizle
wp transient list --search="wc_product_query*" --field=name | xargs -I {} wp transient delete {}

# Rapor verilerini temizle
wp transient list --search="wc_report_*" --field=name | xargs -I {} wp transient delete {}

Senaryo 2: Eklenti Güncellemesi Sonrası Sorun Giderme

Bir eklentiyi güncelledin ve bir şeyler ters gitti. Klasik transient çakışması senaryosu. Önce hangi transient’ların soruna yol açtığını tespit etmek gerekir:

# Güncellenen eklentiyle ilgili transient'ları bul
wp transient list --search="my_plugin_*" --format=json | python3 -m json.tool

# Şüpheli transient'ı manuel olarak incele
wp transient get my_plugin_api_response

# Değeri sil ve sistemin yeniden oluşturmasını bekle
wp transient delete my_plugin_api_response

# Süresi dolmuş olanları da temizle
wp transient delete --expired

Senaryo 3: Zamanlanmış Transient Temizlik Script’i

Production sunucularda düzenli transient temizliği için bir bash script’i oluşturabilirsin. Bu script cron ile çalıştırıldığında veritabanının şişmesini önler:

#!/bin/bash
# /usr/local/bin/wp-transient-cleanup.sh

WP_PATH="/var/www/html/wordpress"
LOG_FILE="/var/log/wp-transient-cleanup.log"
DATE=$(date '+%Y-%m-%d %H:%M:%S')
WP_USER="www-data"

echo "[$DATE] Transient temizligi basliyor..." >> $LOG_FILE

# Süresi dolmuş transient sayısını logla
EXPIRED_COUNT=$(sudo -u $WP_USER wp transient list --path=$WP_PATH --expired --format=count 2>/dev/null)
echo "[$DATE] Suresi dolmus transient sayisi: $EXPIRED_COUNT" >> $LOG_FILE

# Süresi dolmuş transient'ları temizle
sudo -u $WP_USER wp transient delete --path=$WP_PATH --expired 2>/dev/null
echo "[$DATE] Suresi dolmus transientlar temizlendi." >> $LOG_FILE

# Toplam kalan transient sayısını logla
TOTAL_COUNT=$(sudo -u $WP_USER wp transient list --path=$WP_PATH --format=count 2>/dev/null)
echo "[$DATE] Kalan toplam transient sayisi: $TOTAL_COUNT" >> $LOG_FILE

echo "[$DATE] Temizlik tamamlandi." >> $LOG_FILE

Bu script’i crontab’a eklemek için:

# Crontab'ı düzenle
crontab -e

# Her gece 02:00'da çalıştır
0 2 * * * /usr/local/bin/wp-transient-cleanup.sh

Senaryo 4: Object Cache ile Çalışma

Redis veya Memcached kullanıyorsan transient’lar veritabanında değil, bu sistemlerde saklanır. Bu durumda wp transient delete komutları doğrudan object cache’e istek gönderir. Ancak burada dikkat edilmesi gereken bir nokta var:

# Object cache aktif mi kontrol et
wp cache type

# Eğer Redis kullanıyorsan ve transient göremiyorsan
# wp transient list genellikle boş döner çünkü veri DB'de değil
wp transient list

# Bu durumda önce object cache'i flush et
wp cache flush

# Ardından Redis'i de temizle (redis-cli gerektirir)
redis-cli FLUSHDB

# Veya sadece WordPress namespace'ini temizle
redis-cli --scan --pattern "wp_*" | xargs redis-cli DEL

Object cache olmayan ortamlarda da veritabanını doğrudan incelemek isteyebilirsin:

# wp_options tablosundaki transient sayısını kontrol et
wp db query "SELECT COUNT(*) FROM wp_options WHERE option_name LIKE '_transient_%';"

# En büyük transient'ları bul (byte cinsinden)
wp db query "SELECT option_name, LENGTH(option_value) as size FROM wp_options WHERE option_name LIKE '_transient_%' ORDER BY size DESC LIMIT 10;"

# Süresi dolmuş transient'ları veritabanından sil (manuel)
wp db query "DELETE FROM wp_options WHERE option_name LIKE '_transient_timeout_%' AND option_value < UNIX_TIMESTAMP();"

Multisite Ortamında Transient Yönetimi

WordPress Multisite kurulumlarında transient yönetimi biraz daha karmaşıklaşır. Hem site bazlı hem de network genelinde transient’lar mevcuttur:

# Belirli bir alt siteye geç (blog ID = 2)
wp transient list --url=https://site2.ornek.com

# Network genelindeki transient'ları listele
wp transient list --network

# Tüm alt siteleri döngüyle temizle
for SITE_URL in $(wp site list --field=url); do
    echo "Temizleniyor: $SITE_URL"
    wp transient delete --expired --url=$SITE_URL
done

# Network transient'larını temizle
wp transient delete --expired --network

Transient Boyutlarını İzleme

Büyük transient’lar veritabanı performansını ciddi ölçüde etkiler. Özellikle serileştirilmiş PHP dizileri veya JSON verileri MB boyutuna ulaşabilir. Bunu izlemek için:

# Büyük transient'ları tespit et (1MB üzeri)
wp db query "
SELECT 
    option_name, 
    ROUND(LENGTH(option_value) / 1024, 2) as size_kb
FROM wp_options 
WHERE option_name LIKE '_transient_%' 
    AND option_name NOT LIKE '_transient_timeout_%'
    AND LENGTH(option_value) > 102400
ORDER BY LENGTH(option_value) DESC;
"

# Toplam transient boyutunu öğren
wp db query "
SELECT 
    ROUND(SUM(LENGTH(option_value)) / 1024 / 1024, 2) as total_mb
FROM wp_options 
WHERE option_name LIKE '_transient_%';
"

Hata Ayıklama ve Sorun Giderme

Transient Neden Yenilemiyor?

Bazen transient silinmesine rağmen yeniden oluşmuyor gibi görünür. Bu durumda şunları kontrol et:

# Transient'ın gerçekten silinip silinmediğini doğrula
wp transient get problem_transient
# Boş çıktı = başarıyla silindi

# WordPress'in cron sistemini manuel tetikle
# (transient yenilenmesi çoğu zaman bir istek tetikler)
wp cron event run --due-now

# Tüm zamanlanmış görevleri listele
wp cron event list

Transient Değeri Bozuk Görünüyor

PHP serileştirme sorunları nedeniyle transient değerleri bazen okunaksız hale gelir:

# Ham değeri veritabanından al
wp db query "SELECT option_value FROM wp_options WHERE option_name = '_transient_bozuk_transient';"

# Değeri sil ve sistemi yeniden oluşturmaya zorla
wp transient delete bozuk_transient

# PHP'nin serileştirme kontrolü için (opsiyonel)
wp eval "
$value = get_transient('test_transient');
var_dump($value);
"

Transient’lar Çok Hızlı Dolup Bitiyor

Eğer bir transient sürekli yeniden oluşturuluyorsa ve bu veritabanı yükü yaratıyorsa, sorunu tespit etmek için:

# Belirli bir key'in kaç kez yaratıldığını izle (slow query log ile)
wp db query "SHOW VARIABLES LIKE 'slow_query_log';"

# MySQL slow query log'u etkinleştir
wp db query "SET GLOBAL slow_query_log = 'ON';"
wp db query "SET GLOBAL long_query_time = 1;"

Transient Yönetiminde En İyi Pratikler

Production ortamında transient yönetimi için önerim şu pratikleri benimsemektir:

  • Düzenli temizlik: Süresi dolmuş transient’lar otomatik silinmez, her gece cron ile temizle
  • Object cache kullan: Redis veya Memcached ile transient’ları veritabanından uzaklaştır
  • Büyük transient’ları izle: 1MB üzeri transient’lar genellikle bir tasarım hatasına işaret eder
  • Deployment sonrası temizlik: Her kod güncellemesinden sonra ilgili transient’ları temizle
  • Monitoring ekle: Transient sayısını ve boyutunu Grafana veya benzeri araçlarla izle
  • --all parametresinden kaçın: Yüksek trafikli sitelerde ani cache boşalması tehlikelidir
  • Multisite’da dikkatli ol: Her siteyi ayrı ayrı temizle, network transient’larını unutma

Deployment pipeline’ına transient temizliğini eklemek için basit bir örnek:

#!/bin/bash
# deploy-post-hooks.sh

echo "Deploy sonrasi temizlik basliyor..."

# Tema ve eklenti güncellemelerinden etkilenebilecek transient'ları temizle
wp transient delete --expired
wp transient delete wc_products_onsale
wp transient delete wc_featured_products
wp transient delete plugin_slugs

# Object cache varsa onu da temizle
wp cache flush

echo "Temizlik tamamlandi."

Sonuç

WP-CLI transient komutları, WordPress site yönetiminin en az ilgi gören ama en kritik araçlarından biridir. Veritabanı şişmesini önlemek, performans sorunlarını gidermek ve eklenti çakışmalarını çözmek için bu komutları repertuarında bulundurman şart.

Özellikle şu noktaları aklında tut: Süresi dolmuş transient’lar otomatik temizlenmez, bu yüzden zamanlanmış temizlik script’i şart. Object cache kullanıyorsan wp transient list beklediğin gibi çalışmayabilir. Multisite ortamında hem site bazlı hem de network transient’larını ayrı yönet. Ve --all parametresini production’da kullanmadan önce mutlaka trafik durumunu değerlendir.

Komut satırından WordPress yönetimi, özellikle erişim sorunu yaşadığın kritik anlarda seni kurtaracak becerilerden biridir. Transient API’sini anlamak ve WP-CLI ile verimli kullanmak, sysadmin olarak WordPress ekosistemindeki hakimiyetini bir adım öteye taşır.

Bir yanıt yazın

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