Wordpress İle Özel Bir Cron İş Zamanlayıcı Sistemi Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Özel bir cron sistemi geliştirmeye başlamadan önce, temel WordPress geliştirme ortamınızın hazır olduğundan emin olmalısınız. Sisteminizde en az PHP 8.2 veya üzeri bir sürümün çalışıyor olması, güvenlik ve performans açısından kritik öneme sahiptir.

  • Yerel Geliştirme Ortamı: LocalWP, XAMPP veya Docker tabanlı bir WordPress kurulumu.
  • Kod Editörü: VS Code veya benzeri bir editör.
  • WP-CLI: Komut satırı üzerinden cron işlerini yönetmek ve test etmek için önerilir.
  • Debug Modu: Geliştirme aşamasında wp-config.php dosyanızda define( 'WP_DEBUG', true ); satırının aktif olduğundan emin olun.

WP-Cron Mekanizması Nasıl Çalışır?

WordPress'in yerleşik zamanlayıcısı olan WP-Cron, standart Linux cron işlerinden farklı çalışır. Bir kullanıcı sitenizi ziyaret ettiğinde tetiklenir ve o an zamanı gelmiş olan görevleri kontrol eder. Bu, düşük trafikli sitelerde görevlerin gecikmeli çalışmasına neden olabilir. Ancak, sistemin temel mantığını anlamak, doğru kurgu yapmanızı sağlar.

Bir cron işini kaydetmek için üç temel adıma ihtiyacınız vardır: Bir zamanlama aralığı eklemek, bir kanca (hook) oluşturmak ve bu kancayı tetikleyecek fonksiyonu tanımlamak.

Adım 1: Özel Zamanlama Aralıkları Tanımlama

WordPress varsayılan olarak saatlik, günlük ve iki günlük periyotlar sunar. Eğer daha spesifik bir aralığa (örneğin her 15 dakikada bir) ihtiyacınız varsa, cron_schedules filtresini kullanmalısınız.


add_filter( 'cron_schedules', 'ozel_cron_araliklarini_ekle' );

function ozel_cron_araliklarini_ekle( $schedules ) {
    // 15 dakikada bir çalışacak aralık ekleyelim
    $schedules['onbes_dakika'] = array(
        'interval' => 900, // Saniye cinsinden
        'display'  => esc_html__( 'Her 15 Dakikada Bir' ),
    );
    return $schedules;
}

Yukarıdaki kod bloğu, WordPress zamanlayıcı listesine "onbes_dakika" adında yeni bir anahtar ekler. interval değeri saniye cinsinden hesaplanır; bu nedenle 15 dakika 900 saniyeye eşittir.

Adım 2: Cron İşini Zamanlama

Zaman aralığını belirledikten sonra, bu görevi sisteme kaydetmeniz gerekir. Bu işlem genellikle temanızın functions.php dosyasında veya özel bir eklentide yapılır. Görevin mükerrer çalışmasını engellemek için wp_next_scheduled kontrolünü kullanmak zorunludur.


if ( ! wp_next_scheduled( 'benim_ozel_cron_kancasi' ) ) {
    wp_schedule_event( time(), 'onbes_dakika', 'benim_ozel_cron_kancasi' );
}

Bu kod, "benim_ozel_cron_kancasi" isimli görevin zaten zamanlanıp zamanlanmadığını kontrol eder. Eğer zamanlanmadıysa, hemen başlatır ve her 15 dakikada bir tekrarlar.

Adım 3: Çalıştırılacak Fonksiyonu Yazma

Zamanı geldiğinde WordPress'in ne yapacağını belirleyen fonksiyonu oluşturmalısınız. Bu fonksiyon, bir kanca ile tetiklenecektir.


add_action( 'benim_ozel_cron_kancasi', 'cron_gorevini_gerceklestir' );

function cron_gorevini_gerceklestir() {
    // Veritabanı işlemleri veya API istekleri burada yapılır
    $log_mesaji = "Cron görevi " . date('Y-m-d H:i:s') . " tarihinde çalıştı.";
    error_log( $log_mesaji );
}

Bu örnekte, basit bir error_log işlemi ile cronun çalıştığını sunucu günlüklerine kaydediyoruz. Gerçek projelerde burada veritabanı sorguları veya e-posta gönderme işlemleri yer alabilir.

Adım 4: Cron İşini Temizleme ve Güvenlik

Eklentiniz veya temanız devre dışı bırakıldığında, zamanlanmış görevlerin sistemde kalıntı bırakmaması gerekir. Bu, veritabanı şişmesini önler ve temiz bir çalışma ortamı sağlar.


register_deactivation_hook( __FILE__, 'cron_gorevini_temizle' );

function cron_gorevini_temizle() {
    $timestamp = wp_next_scheduled( 'benim_ozel_cron_kancasi' );
    wp_unschedule_event( $timestamp, 'benim_ozel_cron_kancasi' );
}
Kritik Uyarı: Cron işleri içerisinde asla doğrudan kullanıcı girdilerini ($_GET veya $_POST) kullanmayın. Cron işlemleri arka planda çalıştığı için kullanıcı oturumu yoktur. Ayrıca, veritabanı işlemlerinde her zaman $wpdb sınıfını kullanarak SQL injection riskine karşı hazırlıklı olun.

Yöntem Karşılaştırması

Yöntem Avantajı Dezavantajı
WP-Cron Kolay kurulum, WordPress entegrasyonu Trafiğe bağlı çalışma (gecikme riski)
Sunucu Cron (Crontab) Tam zamanında çalışma Sunucu erişimi gerektirir, karmaşık

Sıkça Sorulan Sorular

WP-Cron neden tam zamanında çalışmıyor?

WP-Cron, bir ziyaretçi sitenize girdiğinde tetiklenir. Eğer sitenize kimse girmezse, zamanı gelen görev çalışmaz. Bu sorunu aşmak için sunucunuzda gerçek bir Linux cron işi kurarak wp-cron.php dosyasını düzenli tetikleyebilirsiniz.

Cron işinin çalışıp çalışmadığını nasıl anlarım?

WP-Crontrol eklentisini kurarak zamanlanmış tüm görevleri arayüz üzerinden görebilir ve manuel olarak tetikleyebilirsiniz.

Cron görevleri veritabanını yorar mı?

Eğer çok sık (örneğin her saniye) çalışan ve ağır SQL sorguları içeren bir cron göreviniz varsa, veritabanı performansını olumsuz etkileyebilir. İşlemleri küçük parçalara bölmek en iyi pratiktir.

Cron içerisinde dosya yükleme yapabilir miyim?

Evet, ancak dosya yollarının mutlak (absolute) olduğundan emin olmalısınız. ABSPATH sabitini kullanarak dosya dizinlerine erişim sağlayabilirsiniz.

Aynı anda birden fazla cron işi çalışabilir mi?

Evet, WordPress aynı anda birden fazla görevi işleyebilir. Ancak kaynak tüketimini izlemek için sunucu limitlerinizi göz önünde bulundurmalısınız.

Sorumluluk Reddi: Bu rehberdeki kod örnekleri genel eğitim amaçlıdır. Üretim ortamında (production) kullanmadan önce mutlaka bir geliştirme ortamında test edin. Yanlış yapılandırılmış cron işleri sunucu kaynaklarının tükenmesine neden olabilir.

WP-CLI ile Cron Görevlerini Yönetme ve İzleme

WordPress cron sistemini arayüzden yönetmek bazen karmaşık olabilir. WP-CLI (WordPress Command Line Interface), cron görevlerinizi doğrudan terminal üzerinden görüntülemenize, çalıştırmanıza ve hata ayıklamanıza olanak tanır. Özellikle büyük ölçekli sitelerde, veritabanı sorgularını tetiklemeden görevleri yönetmek için bu yöntem tercih edilmelidir.

Mevcut cron görevlerini listelemek için aşağıdaki komutu kullanabilirsiniz:

wp cron event list

Eğer belirli bir zamanlanmış görevi beklemek yerine hemen çalıştırmak isterseniz, şu komut ile tetikleme yapabilirsiniz:

wp cron event run --hook=ozel_cron_gorevi_kancasi

Bu yöntem, sunucu üzerindeki PHP limitlerine takılmadan işlemleri manuel olarak test etmenize yardımcı olur. Ayrıca, wp cron event delete komutu ile hatalı veya artık ihtiyaç duyulmayan görevleri temizleyerek veritabanı şişmesini önleyebilirsiniz.

Cron İşlerinde Performans Optimizasyonu ve Hata Ayıklama

Cron işleriniz büyüdükçe, arka planda çalışan süreçlerin sunucu yanıt sürelerini (TTFB) etkilememesi için bazı stratejiler uygulamanız gerekir. Özellikle uzun süren veritabanı işlemleri için "batch processing" (toplu işleme) mantığını kullanmak hayati önem taşır.

Batch (Toplu) İşleme Mantığı

Tüm verileri tek bir cron döngüsünde işlemek yerine, verileri parçalara ayırarak işlemek bellek kullanımını optimize eder. Aşağıdaki örnek, veritabanındaki 1000 kaydı her cron tetiklendiğinde 50'şerli gruplar halinde nasıl işleyebileceğinizi gösterir:

function ozel_toplu_islem_fonksiyonu() {
    global $wpdb;
    $batch_size = 50;
    
    // İşlenmemiş kayıtları al
    $kayitlar = $wpdb->get_results("SELECT * FROM {$wpdb->prefix}ozel_tablo WHERE durum = 'bekliyor' LIMIT $batch_size");

    if (empty($kayitlar)) {
        return;
    }

    foreach ($kayitlar as $kayit) {
        // İşlem mantığı burada yer alır
        $wpdb->update("{$wpdb->prefix}ozel_tablo", array('durum' => 'tamamlandi'), array('id' => $kayit->id));
    }
}

Hata Ayıklama İçin Loglama

Cron görevlerinin arka planda sessizce başarısız olmasını engellemek için mutlaka bir log mekanizması kurun. WordPress'in yerleşik error_log() fonksiyonunu veya WP_DEBUG_LOG özelliğini kullanarak süreçleri takip edebilirsiniz:

function cron_hata_ayiklama_ornek() {
    try {
        // Kritik işlem
        if (!$islem_basarili) {
            throw new Exception("İşlem sırasında beklenmedik hata oluştu.");
        }
    } catch (Exception $e) {
        error_log('Cron Hatası: ' . $e->getMessage());
    }
}

Bu yöntem, wp-content/debug.log dosyasını inceleyerek cron görevlerinizin neden çalışmadığını veya nerede tıkandığını saniyeler içinde tespit etmenizi sağlar.

Sonuç

WordPress ile özel bir cron iş zamanlayıcı sistemi oluşturmak, sitenizin operasyonel yükünü hafifleten en etkili yöntemlerden biridir. Adım adım ilerleyerek kendi zaman aralıklarınızı tanımlayabilir, görevlerinizi güvenli bir şekilde planlayabilir ve temizleme işlemlerini otomatize edebilirsiniz. Bir sonraki aşamada, WP-CLI kullanarak bu görevleri komut satırı üzerinden nasıl yönetebileceğinizi araştırmanızı öneririm.

Bu yazıya tepkinizi paylaşın:
Deniz Aydın

On yıldır pratik yaşam çözümleri üzerine içerik üretiyorum. Okuyucuların karmaşık sorunlarını en basit yöntemlerle çözmelerine yardımcı olmayı hedefliyorum.

Yorumlar (0)

Yorum Yaz