Gereksinimler ve Ön Hazırlık
Özel bir sorgu günlükleyicisi oluşturmaya başlamadan önce, geliştirme ortamınızın güncel olduğundan emin olmalısınız. WordPress 6.x ve üzeri sürümler, PHP 8.2+ ile tam uyumludur. Bu proje için bir test ortamı (staging) kullanmanız, canlı sitenizin veritabanı günlükleriyle dolmasını engellemek için kritiktir.
- PHP 8.2+: Modern sözdizimi ve performans iyileştirmeleri için gereklidir.
- WordPress 6.x:
wpdbsınıfının güncel metodlarını kullanacağız. - Dosya Erişimi: FTP veya SSH üzerinden temanızın
functions.phpdosyasına veya bir özel eklenti dosyasına erişiminiz olmalıdır. - Debug Modu:
wp-config.phpdosyasındaWP_DEBUGdeğerinintrueolduğundan emin olun.
WordPress Veritabanı Sınıfını (wpdb) Anlamak
WordPress, veritabanı işlemleri için $wpdb nesnesini kullanır. Sorguları günlüklemek için bu nesnenin query filtresini kullanacağız. Bu filtre, WordPress'in veritabanına gönderdiği her SQL komutunu yakalamanıza olanak tanır. Aşağıdaki örnekte, basit bir sorgu yakalama mantığını görebilirsiniz.
add_filter('query', function($query) {
// Sorguyu log dosyasına yazma işlemleri burada başlayacak
error_log('Çalışan Sorgu: ' . $query);
return $query;
});
Yukarıdaki kod, query filtresini kullanarak her sorguyu sunucu hata günlüğüne (error_log) yazar. Bu, basit bir başlangıçtır ancak geliştirme aşamasında sorgunun süresini ve hangi fonksiyon tarafından çağrıldığını bilmek çok daha değerlidir.
Adım Adım Sorgu Günlükleyicisi Geliştirme
Şimdi daha profesyonel bir yaklaşım sergileyerek, sorguları bir metin dosyasına yazan ve sorgu süresini hesaplayan bir sınıf oluşturalım. Bu sınıf, sorguları wp-content/uploads/query-logs.log dosyasında saklayacaktır.
class CustomQueryLogger {
private $log_file;
public function __construct() {
$this->log_file = WP_CONTENT_DIR . '/uploads/query-logs.log';
add_filter('query', [$this, 'log_query']);
}
public function log_query($query) {
$timestamp = date('Y-m-d H:i:s');
$log_entry = "[$timestamp] Sorgu: $query" . PHP_EOL;
file_put_contents($this->log_file, $log_entry, FILE_APPEND);
return $query;
}
}
new CustomQueryLogger();
Bu kod bloğu, her sorguyu bir dosyaya ekler. FILE_APPEND bayrağı, dosyanın üzerine yazmak yerine verileri sona eklememizi sağlar. Ancak, bu yöntem henüz sorgu süresini ölçmemektedir.
Sorgu Sürelerini ve Çağıran Fonksiyonları İzleme
Sorguların ne kadar sürdüğünü ölçmek için, sorgu başlamadan hemen önce ve bittikten hemen sonra zaman damgalarını almalıyız. Ayrıca, debug_backtrace() fonksiyonunu kullanarak sorgunun hangi kod bloğu tarafından tetiklendiğini bulabiliriz.
public function log_query_advanced($query) {
$start_time = microtime(true);
// Sorgu çalıştırıldıktan sonra süreyi hesapla
add_action('shutdown', function() use ($query, $start_time) {
$end_time = microtime(true);
$duration = $end_time - $start_time;
$trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 5);
$caller = $trace[4]['function'] ?? 'bilinmiyor';
$entry = sprintf("[%s] Süre: %.4f sn | Fonksiyon: %s | Sorgu: %s\n",
date('Y-m-d H:i:s'), $duration, $caller, $query);
file_put_contents($this->log_file, $entry, FILE_APPEND);
});
return $query;
}
Bu yöntem, shutdown kancasını kullanarak sayfa yüklemesi bittiğinde verileri işler. Bu, performans kaybını minimize eder ve daha doğru süre ölçümleri sağlar.
Sorgu Günlükleme Yöntemleri Karşılaştırması
| Yöntem | Avantajı | Dezavantajı |
|---|---|---|
| Basit error_log | Çok hızlı ve kolay | Veri analizi zor |
| Dosya Tabanlı (Özel) | Kontrol tamamen sizde | Dosya boyutu artabilir |
| Veritabanı Tablosu | Sorgulanabilir veri | Ek yük bindirir |
Güvenlik ve Performans Uyarıları
Kritik Uyarı: Sorgu günlükleyicilerini asla canlı (production) sitelerde uzun süre açık bırakmayın. SQL sorgularınızda kullanıcı parolaları, kişisel veriler veya hassas anahtarlar bulunabilir. Günlük dosyalarınızı .htaccess veya Nginx kuralları ile dış erişime kapatın.
Güvenliği sağlamak için günlük dosyanızın erişilebilirliğini şu şekilde kısıtlayabilirsiniz:
# .htaccess içerisine ekleyin
Order Allow,Deny
Deny from all
Sıkça Sorulan Sorular
Sorgu günlükleyicisi sitemi yavaşlatır mı?
Evet, her sorguda dosya yazma işlemi yapmak, yüksek trafikli sitelerde ciddi performans kaybına yol açar. Bu yüzden sadece hata ayıklama süreçlerinde kullanmalısınız.
Sorgu süresi neden 0.0000 çıkıyor?
Sorgu çok hızlı çalışıyorsa veya sunucunuzun zamanlama çözünürlüğü düşükse bu durumla karşılaşabilirsiniz. microtime(true) fonksiyonu genellikle yeterince hassastır.
Log dosyasının aşırı büyümesini nasıl engellerim?
Log dosyasını her gün temizleyen veya belirli bir boyuta ulaştığında sıfırlayan bir "cron job" (zamanlanmış görev) oluşturabilirsiniz.
Bu yöntemle veritabanı hatalarını da görebilir miyim?
Bu yöntem sadece çalışan sorguları yakalar. Hatalar için $wpdb->last_error değişkenini kontrol eden ek bir fonksiyon yazmanız gerekir.
Özel veritabanı tablolarındaki sorgular yakalanır mı?
Evet, $wpdb üzerinden yapılan tüm sorgular query filtresinden geçtiği için özel tablolarınızdaki sorgular da yakalanacaktır.
Gelişmiş Sorgu Analizi: Yavaş Sorguları Tespit Etme Stratejileri
Sorgu günlükleyiciniz aktif hale geldiğinde, elinizde ham verilerden oluşan devasa bir liste olacaktır. Bu verileri anlamlandırmak ve sitenizin performansını artırmak için "yavaş sorgu" (slow query) eşik değerlerini belirlemelisiniz. Özellikle 0.5 saniyeden uzun süren sorgular, veritabanı indeksleme eksikliğinin veya yanlış tasarlanmış JOIN işlemlerinin bir göstergesidir.
Aşağıdaki kod parçası, günlük dosyanızdaki verileri analiz ederek sadece belirli bir sürenin üzerindeki sorguları filtreleyen yardımcı bir fonksiyon örneğidir:
function analyze_slow_queries($log_file, $threshold = 0.5) {
if (!file_exists($log_file)) return;
$lines = file($log_file);
$slow_queries = [];
foreach ($lines as $line) {
$data = json_decode($line, true);
if ($data && isset($data['time']) && $data['time'] > $threshold) {
$slow_queries[] = $data;
}
}
return $slow_queries;
}
Veritabanı İndeksleme ve Sorgu Optimizasyonu İlişkisi
Günlükleyiciniz sayesinde tespit ettiğiniz yavaş sorguların büyük bir kısmı, tablolarda eksik olan indekslerden kaynaklanır. WordPress'in wp_postmeta veya wp_options gibi tablolarında yapılan karmaşık meta_query işlemleri, indekslenmemiş sütunlarda tam tablo taramasına (full table scan) neden olabilir.
İpucu: Eğer günlüklerinizde WHERE meta_key = ... şeklinde çok sayıda sorgu görüyorsanız, bu alanlar için özel indeksler oluşturmayı veya WP_Query yapınızı 'update_post_meta_cache' => false parametresi ile optimize etmeyi değerlendirmelisiniz.
İleri Düzey Hata Ayıklama (Debug) Teknikleri
Bazen sorgu süresi normal olsa bile, aynı sayfa yüklemesi sırasında aynı sorgunun defalarca çalıştırıldığını (N+1 problemi) fark edebilirsiniz. Bu durumu günlükleyicinizde tespit etmek için sorgu imzasını (query signature) kullanabilirsiniz:
// Sorgu imzasını oluşturma
$query_signature = md5($query);
// Eğer aynı imza kısa sürede tekrar ediyorsa günlükle
if (isset($query_counts[$query_signature])) {
error_log("Tekrarlayan sorgu tespit edildi: " . $query);
}
$query_counts[$query_signature] = true;
Canlı Ortamda (Deployment) İzleme ve Güvenlik
Günlükleme sistemini canlı ortama taşırken, log dosyasının erişilebilirliğini kısıtlamak hayati önem taşır. Log dosyanızı wp-content/uploads gibi dışarıdan doğrudan erişilebilen klasörler yerine, sunucunun kök dizininde veya wp-config.php dosyasının tanımladığı özel bir yolda tutun.
| Önlem | Açıklama |
|---|---|
| Dosya İzinleri | Log dosyasını 600 veya 640 izinleri ile sınırlandırın. |
| Döndürme (Rotation) | Log dosyalarını haftalık olarak arşivleyin veya silin. |
| Veri Maskeleme | Log içerisine kullanıcı şifreleri veya kişisel verilerin (PII) düşmediğinden emin olun. |
Bu stratejilerle, sadece sorguları izlemekle kalmaz, aynı zamanda WordPress sitenizin veritabanı katmanını profesyonel bir seviyede optimize edebilirsiniz. Unutmayın, en iyi sorgu, hiç çalıştırılmayan veya önbellekten (object cache) dönen sorgudur.
Sonuç
WordPress ile özel bir dinamik veritabanı sorgu günlükleyicisi yapmak, sitenizin veritabanı performansını optimize etmek için sahip olabileceğiniz en güçlü araçlardan biridir. Bu rehberde öğrendiğiniz teknikleri kullanarak, hangi sorguların sitenizi yavaşlattığını kolayca tespit edebilir ve gerekli indeksleme veya kod iyileştirmelerini yapabilirsiniz.
Bir sonraki adım olarak, yakaladığınız bu verileri görselleştiren basit bir WordPress yönetici paneli sayfası (admin page) oluşturmayı deneyebilirsiniz. Bu sayede log dosyasına girmeden doğrudan WordPress panelinizden sorgu istatistiklerini izleyebilirsiniz. Kodunuzu her zaman yerel ortamda test etmeyi ve güvenlik önlemlerini ihmal etmemeyi unutmayın.
Sorumluluk Reddi: Bu makaledeki kod örnekleri eğitim amaçlıdır. Canlı sitelerde kullanılmadan önce kapsamlı testlerden geçirilmelidir. Yanlış yapılandırılmış veritabanı günlükleme işlemleri veri kaybına veya performans sorunlarına yol açabilir.

Yorumlar (0)
Yorum Yaz