Gereksinimler ve Ön Hazırlık
Bu projeye 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. İşlemleri canlı sitenizde değil, mutlaka bir yerel (local) geliştirme ortamında denemelisiniz.
- PHP 8.2 veya üzeri bir sürüm.
- WordPress'in güncel bir sürümü.
- Dosya sistemi erişimi ve
wp-config.phpdosyasını düzenleme yetkisi. - Kod düzenleyici (IDE) olarak VS Code veya PhpStorm önerilir.
WordPress Veritabanı Sorgularını Yakalama Mantığı
WordPress, veritabanı işlemlerini wpdb sınıfı üzerinden yönetir. Sorguları izlemek için WordPress'in sunduğu query filtre kancasını (hook) kullanacağız. Bu kanca, her sorgu tetiklendiğinde devreye girer ve sorgunun içeriğini bize sunar.
Aşağıdaki kod örneği, basit bir izleme mekanizmasının temelini oluşturur. Bu kod, sorguları bir diziye alarak geçici olarak hafızada tutar.
// Sorguları yakalamak için temel kanca kullanımı
add_filter('query', function($query) {
global $wpdb;
// Sorgu verisini bir değişkene alıyoruz
$wpdb->last_query_captured = $query;
return $query;
});
Bu yöntem, her sorguyu yakalamak için en temel yaklaşımdır. Ancak, veritabanı performansını düşürmemek adına bu işlemleri koşullu olarak çalıştırmak kritik öneme sahiptir.
Özel Sorgu Günlükleyicisi Sınıfını Oluşturma
Dinamik ve sürdürülebilir bir yapı için nesne yönelimli programlama (OOP) prensiplerini kullanacağız. Bir sınıf oluşturarak günlükleme işlemlerini merkezi bir noktada toplayacağız. Bu sınıf, sorguları dosyaya yazma veya veritabanında özel bir tabloya kaydetme yeteneklerine sahip olacak.
class CustomQueryLogger {
public function __construct() {
add_filter('query', [$this, 'log_query'], 10, 1);
}
public function log_query($query) {
$log_entry = sprintf("[%s] Sorgu: %s\n", date('Y-m-d H:i:s'), $query);
error_log($log_entry, 3, WP_CONTENT_DIR . '/db_queries.log');
return $query;
}
}
new CustomQueryLogger();
Yukarıdaki sınıf, wp-content dizini altında db_queries.log adında bir dosya oluşturur ve her sorguyu buraya yazar. error_log fonksiyonu ile sorguları dosyaya güvenli bir şekilde aktarıyoruz.
Sorgu Performansını Ölçme ve Analiz Etme
Sadece sorguları görmek yetmez; hangi sorgunun ne kadar sürede çalıştığını da bilmeniz gerekir. Bunun için microtime fonksiyonunu kullanarak sorgu öncesi ve sonrası zaman damgalarını karşılaştıracağız.
// Sorgu süresini ölçen fonksiyon
add_filter('query', function($query) {
$GLOBALS['start_time'] = microtime(true);
return $query;
});
add_filter('posts_results', function($posts) {
$time_taken = microtime(true) - $GLOBALS['start_time'];
if ($time_taken > 0.05) { // 0.05 saniyeden uzun sürenleri logla
error_log("Yavaş Sorgu: " . $time_taken . " saniye");
}
return $posts;
});
Bu kod bloğu, özellikle yavaş çalışan sorguları tespit etmek için kullanılır. posts_results filtresi, ana sorgu tamamlandığında tetiklenir.
Veritabanı Günlükleme Yöntemlerinin Karşılaştırılması
Aşağıdaki tablo, farklı günlükleme yöntemlerinin avantaj ve dezavantajlarını özetlemektedir.
| Yöntem | Avantajı | Dezavantajı |
|---|---|---|
| Dosya (Log File) | Hızlıdır, veritabanını yormaz. | Dosya boyutu hızla büyüyebilir. |
| Özel Tablo | Sorgulanabilir ve filtrelenebilir. | Ek yük oluşturur, performansı düşürür. |
| Debug Bar (Eklenti) | Görselleştirme sağlar. | Sadece geliştirme ortamı içindir. |
Kritik Güvenlik Uyarısı: Sorgu günlükleme sistemlerini asla üretim ortamında (production) kalıcı olarak açık bırakmayın. Sorgular içerisinde kullanıcı şifreleri, kişisel veriler veya hassas API anahtarları bulunabilir. Günlük dosyalarınızı mutlaka .htaccess veya web sunucusu ayarları ile dış erişime kapatın.
Sorgu Günlükleyicisini Güvenli Hale Getirme
Sisteminizi güvenli tutmak için günlüklenen verileri filtrelemelisiniz. Örneğin, wp_users tablosundaki user_pass sütununu içeren sorguları loglamaktan kaçınmalısınız. Aşağıdaki örnekte, hassas verileri maskeleme mantığını görebilirsiniz.
public function log_query($query) {
// Şifre içeren sorguları filtrele
if (strpos($query, 'user_pass') !== false) {
return $query;
}
// Güvenli günlükleme işlemleri burada devam eder
return $query;
}
Bu basit kontrol, veritabanı günlüklerinizin güvenliğini önemli ölçüde artırır. Hassas verilerin günlük dosyalarına sızmasını engellemek, veri gizliliği yasaları açısından da bir zorunluluktur.
Sıkça Sorulan Sorular
1. Bu günlükleyici sistemi sitemi yavaşlatır mı?
Evet, her sorguda dosya yazma işlemi yapmak ek bir yük getirir. Bu yüzden bu sistemi sadece hata ayıklama (debug) süreci boyunca aktif etmeli, işiniz bittiğinde devre dışı bırakmalısınız.
2. Neden özel bir tablo yerine dosya kullanmalıyım?
Özel bir tablo kullanmak, her sorgu için veritabanına bir "yazma" sorgusu daha eklemek demektir. Bu da "kısır döngü" yaratarak sistemin kilitlenmesine neden olabilir. Dosya yazımı bu yüzden daha güvenlidir.
3. Hangi sorguların yavaş olduğunu nasıl anlarım?
microtime fonksiyonu ile sorgu başlangıç ve bitiş sürelerini kaydedip, aradaki farkı bir log dosyasına yazarak hangi sorgunun darboğaz yarattığını kolayca görebilirsiniz.
4. Log dosyalarım çok büyürse ne yapmalıyım?
Sunucu tarafında logrotate gibi araçlar kullanabilir veya her günün sonunda dosyayı temizleyen bir WordPress Cron işi (WP-Cron) oluşturabilirsiniz.
5. Bu yöntem SQL Injection riskini artırır mı?
Hayır, bu yöntem sadece mevcut sorguları okur. Sorgu oluşturma aşamasında WordPress'in $wpdb->prepare() metodunu kullandığınız sürece SQL Injection riskiniz bulunmaz.
Sorumluluk Reddi: Bu rehberdeki kod örnekleri eğitim amaçlıdır. Uygulama sırasında oluşabilecek veri kaybı, performans sorunları veya güvenlik açıklarından kullanıcı sorumludur. Projeyi her zaman önce bir test ortamında doğrulayın.
Gelişmiş Sorgu Analizi İçin Görselleştirme Paneli
Veritabanı günlüklerini ham metin dosyaları veya veritabanı tabloları üzerinden okumak zaman alıcı olabilir. WordPress yönetici panelinde, kaydedilen sorguları analiz edebileceğiniz basit bir arayüz oluşturmak, performans darboğazlarını görselleştirmenize yardımcı olur. Aşağıdaki kod bloğu, veritabanındaki günlükleri listeleyen bir admin sayfası oluşturmak için temel yapıyı sunar.
add_action('admin_menu', 'register_query_logger_admin_page');
function register_query_logger_admin_page() {
add_management_page(
'Sorgu Günlükleri',
'Sorgu Günlükleri',
'manage_options',
'query-logger-dashboard',
'render_query_logger_dashboard'
);
}
function render_query_logger_dashboard() {
global $wpdb;
$table_name = $wpdb->prefix . 'query_logs';
$results = $wpdb->get_results("SELECT * FROM $table_name ORDER BY created_at DESC LIMIT 50");
echo 'Son 50 Sorgu Analizi
';
echo '';
echo 'Sorgu Süre (ms) Tarih ';
foreach ($results as $row) {
echo '';
echo '' . esc_html($row->query) . ' ';
echo '' . esc_html($row->execution_time) . ' ';
echo '' . esc_html($row->created_at) . ' ';
echo ' ';
}
echo '
';
}
Üretim Ortamında (Production) Performans Optimizasyonu
Canlı sitelerde her sorguyu günlüklemek, veritabanı üzerinde ek bir yük oluşturur. Bu durumu yönetmek için "Örnekleme" (Sampling) yöntemini kullanmalısınız. Her sorguyu değil, sadece belirli bir sürenin üzerindeki (örneğin 0.5 saniyeden yavaş) sorguları kaydetmek, sistemin genel performansını korumanıza olanak tanır.
Eşik Değerli Günlükleme Mantığı
Sisteminizi daha verimli hale getirmek için günlükleme sınıfınızın içine bir eşik (threshold) kontrolü ekleyin. Bu, sadece "yavaş sorguları" yakalamanızı sağlar.
// Günlükleme sınıfı içerisindeki metodunuzu güncelleyin
public function log_query($query, $time) {
$threshold = 0.5; // Saniye cinsinden eşik değer
if ($time >= $threshold) {
global $wpdb;
$wpdb->insert(
$wpdb->prefix . 'query_logs',
[
'query' => $query,
'execution_time' => $time,
'created_at' => current_time('mysql')
]
);
}
}
İpucu: Eğer sitenizde çok yüksek trafik varsa, veritabanı tablosuna yazmak yerine bu verileri geçici olarak birtransientveyaRedisönbelleğinde biriktirip, belirli aralıklarla (cron job ile) toplu halde (batch insert) veritabanına aktarmak disk I/O yükünü ciddi oranda azaltacaktır.
Veritabanı Tablosunu Temiz Tutma
Günlük tablonuzun sınırsız büyümesini engellemek için bir "Otomatik Temizleme" mekanizması kurmanız şarttır. WordPress wp-cron sistemini kullanarak 7 günden eski kayıtları otomatik silen bir fonksiyon ekleyebilirsiniz:
if (!wp_next_scheduled('cleanup_query_logs_event')) {
wp_schedule_event(time(), 'daily', 'cleanup_query_logs_event');
}
add_action('cleanup_query_logs_event', 'delete_old_query_logs');
function delete_old_query_logs() {
global $wpdb;
$table_name = $wpdb->prefix . 'query_logs';
$wpdb->query("DELETE FROM $table_name WHERE created_at < DATE_SUB(NOW(), INTERVAL 7 DAY)");
}
Sonuç
WordPress ile özel bir dinamik veritabanı sorgu günlükleyicisi yapmak, veritabanı katmanındaki görünmez süreçleri aydınlatmanızı sağlar. Bu rehberde öğrendiğiniz yöntemlerle, sorgu sürelerini ölçebilir, yavaş çalışan fonksiyonları tespit edebilir ve sitenizin performansını bir üst seviyeye taşıyabilirsiniz. Bir sonraki adım olarak, bu günlükleri görselleştiren bir WordPress yönetici paneli sayfası (Admin Page) oluşturarak verileri daha kolay analiz etmeyi deneyebilirsiniz.


Yorumlar (0)
Yorum Yaz