Zamanlanmış Görevler

Zamanlanmış görevler, sitenizde arka planda sessiz sessiz çalışan minik robotlar gibidir. Bir yazıyı saat 09:00'da yayınlatmak, her gece yedek almak, AI taslaklarını teker teker işlemek — bütün bunlar siz hiçbir şey yapmasanız da kendi başlarına halledilir. jekcms bu işleri cron adında bir sistemle yürütür.

Cron nedir, bu neden lazım?

Cron, sunucunuzda "şu saatte şu komutu çalıştır" diyen bir zamanlayıcıdır. jekcms'in her dakika kontrol etmesi gereken küçük bir dosyası var (cron.php). Cron bu dosyaya her dakika bir kere uğrar, dosya da o an yapılması gereken ne iş varsa onu yapar. Sizin sitenizde yapmanız gereken tek şey, sunucunuza "her dakika bu dosyaya uğra" demek. Nasıl diyeceğinizi birazdan anlatacağız.

jekcms'in kutudan çıkar çıkmaz yaptığı işler

Siz hiç kurcalamasanız bile şu işler zaten tanımlı geliyor:

  • post.scheduled_publish — dakikada bir çalışır. "10:00'da yayınlansın" dediğiniz yazıyı tam zamanında canlıya alır.
  • ai.bulk_worker — dakikada bir çalışır. Toplu AI üretimi kuyruğundaki bir sonraki yazıyı işler.
  • license.heartbeat — altı saatte bir jekcms lisans sunucusuna "ben hayattayım" diye haber verir.
  • updates.check — altı saatte bir yeni jekcms sürümü var mı diye bakar; varsa admin panele "Güncelleme mevcut" bildirimi düşer.
  • backup.rotate — her gece 03:00'te yedekleri döndürür, en yeni beş tanesini tutar, gerisini siler.
  • sitemap.refresh — yarım saatte bir sitemap.xml'i yeniden oluşturur (eğer yeni yazı/güncelleme varsa).

Bu yerleşik görevleri silemezsiniz ama istemezseniz kapatabilirsiniz. Automation → Scheduled Tasks sayfasında listelerini görüp aç-kapa yapabilirsiniz.

Kendi görevinizi eklemek

Diyelim ki her sabah 08:00'de size son 24 saatin yazılarını özetleyen bir e-posta gitsin istiyorsunuz. Bunu kendiniz yazabilirsiniz.

Automation → Scheduled Tasks → New task seçeneğini açın ve şu alanları doldurun:

  • Name: benzersiz bir kısa ad, örn. ozet.gunluk_eposta
  • Interval: iki çalıştırma arası kaç saniye bekleyecek (saatlik için 3600, günlük için 86400)
  • Callable: çalıştırılacak PHP kodunun adı, örn. MyPlugin\Jobs\DailyDigest::run
  • Enabled: açık

Sonra ilgili PHP sınıfını yazarsınız. İşte basit bir örnek:

namespace MyPlugin\Jobs;

class DailyDigest {
    public static function run(array $task): string {
        $rows = DB::query('SELECT id FROM posts WHERE created_at > NOW() - INTERVAL 1 DAY')->all();
        Mailer::sendDigest($rows);
        return 'ok: ' . count($rows) . ' posts';
    }
}

Fonksiyonun geriye döndüğü kısa yazı (ok: 42 posts gibi) admin panelde "son çalıştırma durumu" olarak görünür — böylece geçmişe bakıp ne olup bittiğini anlayabilirsiniz.

İşler ters giderse ne olur?

Bir görev hata verirse jekcms hemen pes etmez. Önce 1 dakika sonra, sonra 5 dakika, sonra 15 dakika, sonra 1 saat sonra yeniden dener. Dört denemede de başarısız olursa görevi degraded olarak işaretler ve duraklatır. Admin panele bir uyarı düşer, siz de hatanın kaynağını düzelttikten sonra görevi elle yeniden açarsınız.

Geçmişi nereden görürüm?

Her görevin yanında bir History düğmesi vardır. Son 100 çalıştırmayı; ne zaman çalıştığı, ne kadar sürdüğü, başarılı mı olduğu, hata verdiyse ne yazdığıyla birlikte gösterir. "Benim görevim hiç tetiklenmiyor" diye şüphelendiğinizde bakacağınız ilk yer burasıdır — çünkü çoğu zaman görev aslında çalışıyordur, sadece beklediğiniz şeyi yapmıyordur.

Peki ya cron gerçekten çalışmıyorsa?

jekcms'in küçük bir yedek planı var: sitenize gelen ziyaretçi isteklerinin yaklaşık %2'si, gizlice bekleyen bir görevi tetikler. Yani yoğun bir siteyse işler aşağı yukarı yürür. Ama düşük trafikli bir siteyseniz buna güvenmeyin — zamanlanmış yazınız belki hiç yayına girmez. Gerçek cron kurmak hep daha iyidir. Kurulumun detayları için Cron Kurulumu sayfasına bakın.

Yeniliklerden ilk sen haberdar ol

Yeni özellikler, sürüm notları ve CMS rehberleri — ayda birkaç e-posta, spam yok.