Zamanlanmış Görevler

jekcms'in kendi başına yaptığı her iş tek bir fonksiyondan geçer: kurulum kökündeki cron.php içinde jek_cron_run(). Saat 14:37'de bir yazıyı yayına almak da, bülten grubunu göndermek de, önbelleği budamak da, site haritasını tazelemek de oradan geçer. Görev yöneticisi diye bir ekran yok, ayarlanacak bir şey de yok. Neyin zamanı geldiğine motor karar verir. Her adım işe girişmeden önce kendi ön koşuluna bakar; bu yüzden motoru sık çağırmak ucuzdur.

İçerik Stüdyosu genel bakışı: takvim ve iş sayaçları
Planlanan partiler, AI taslakları, içe aktarımlar ve başarısız işler bu tek görünüme raporlar.

Tasarımın alışılmadık yanı şu: motorun iki ayrı sürücüsü var. Gerçek bir cron görevi cron.php'yi belirli aralıklarla çağırır. Hiç kurmazsanız ziyaretçiler sizin yerinize çağırır. İkisi de aynı gövdeyi koşturur; aralarındaki tek fark zaman hassasiyetidir.

Ziyaretçi tetikli yol

PseudoCron her ön yüz isteğinde yoklanır. İsteklerin büyük çoğunluğunda yaptığı tek şey, önbellek klasöründen bir iki küçük dosya okumaktır. Orada bir "sıradaki işin zamanı" damgası tutulur; o damga geçene kadar tek bir veritabanı sorgusu bile çalışmaz.

Damga geçtiğinde motor devreye girer, ama yanıt ziyaretçiye teslim edildikten sonra: bağlantıyı önce fastcgi_finish_request() ya da litespeed_finish_request() kapatır. Bağlantıyı erken kapatamayan ortamlarda - klasik mod_php gibi - jekcms bunun yerine kendi cron.php?tick=1 adresine bir saniyelik bir istek atar, yanıtını beklemeden yoluna devam eder. İki durumda da okuyucu hiçbir şey beklemez.

Sıradaki iş damgası üç şeyden hesaplanır: scheduled durumundaki yazıların en erken scheduled_at değeri, içerik kuyruğundaki en erken tarih/saat ve scheduled_tasks tablosundaki en erken bekleyen satır. Üçü de boşsa motor beş dakika sonra yeniden bakar. Her hâlükârda dakikada birden fazla koşmaz.

14:37'ye kurduğunuz yazı bu yüzden 14:37'den sonraki ilk ziyarette çıkar. "Zamanlanmış yazı saatini kaçırdı" şikâyetinin burada karşılığı yok. Tek gerçek sınır, ziyaretçiye bağlı her zamanlayıcının sınırı: hiç trafiği olmayan bir sitede - kendi panel oturumlarınız da dahil - motoru ateşleyecek kimse yoktur.

Gerçek cron yolu

cron.php komut satırından ya da kimlik doğrulanmış bir HTTP tetiğiyle koştuğunda önbellek klasörüne bir tazelik bayrağı bırakır. O bayrak yirmi dakikadan taze olduğu sürece PseudoCron kendini tamamen kapatır; yani cron'u kurulu bir sitede ön yüz isteklerine hiç ek yük binmez. Kalıcı olarak kapatmak isterseniz yapılandırmanıza JEK_DISABLE_PSEUDO_CRON sabitini true olarak ekleyin.

İki yol aynı kilit dosyasını paylaşır. Uzun süren bir tur - yedek alma, büyük bir SMTP grubu - bir sonraki dakikanın tetiğiyle üst üste binemez; ikinci çağrı skipped: previous run still active yazıp çıkar.

Barındırma paneli başına kurulum Cron Kurulumu sayfasında.

Motor ne yapıyor

Bir tur, sabit bir listeyi baştan sona işler. Kabaca şu sırayla:

Önce duraklamış bir AI toplu analiz işi varsa sürdürülür ve ondan tam olarak bir öğe işlenir. Tur başına tek öğe, sizi Gemini'nin dakikalık sınırının rahatça altında tutar. Sonra zamanı geldiyse lisans nabzı atılır, zamanlanmış yazılar ve vakti gelen içerik kuyruğu öğeleri yayına alınır. Açtıysanız otomatik çekirdek, tema ve eklenti güncellemeleri uygulanır - günde en çok bir kez, yönetilen kurulumda hiç.

Ardından ürünü zaman içinde ayakta tutan işler gelir. Bülten özetleri ve kampanya grupları. Önceki turda zaman bütçesi dolduğu için yarım kalan Web Push yayınları. CRM eklentisinin günlük kitle tazelemesi. Haftalık Google Console performans özeti. Saklama budamasıyla birlikte zamanlanmış yedek. GEO raporunu besleyen AI tarayıcı kayıtlarının aktarımı. Haftalık içerik tazeleme taraması, haftalık 404 raporu, saatlik gündem radarı. En sonda da oturumları düşüren, bayat önbellek ve besleme kayıtlarını süpüren otomatik bakım.

Listede bir avuç tek seferlik onarım da var: ayar iyileştirmesi, dağıtım sonrası bütünlük manifesti yenileme, görsel varyantı tamamlama, metin kodlaması onarımı. Her biri bir işaretle kilitli - kod sürümü başına bir kez koşar, sonra bir daha çalışmaz. Bunları görmezsiniz, düşünmeniz de gerekmez.

Tek seferlik görev kuyruğu

scheduled_tasks düz bir iş tablosudur: type, JSON payload, scheduled_at, status (pending → processing → completed ya da failed), attempts, max_attempts ve error_message. Satırları ürün özellikleri yazar; tabloyu doğrudan yöneten bir ekran yoktur.

Bugün önemli olan tür content_generation. Satırlarını Toplu İçerik Planla yazar, API üzerinden bir n8n iş akışı tüketir - bkz. Toplu AI Üretimi. İçerik Stüdyosu takvimi bu satırları içerik kuyruğu öğeleriyle yan yana gösterir; böylece başarısız bir grubu görmek için SQL'e girmeniz gerekmez.

Bir uyarı: eski admin/cron.php işleyicisi hâlâ diskte duruyor ve birkaç başka görev türünü daha tanıyor. Onu çalıştıran bir zamanlayıcı yok. Cron'unuzu ona yöneltmeyin, kurulum kökündeki cron.php'yi kullanın.

Turu kendiniz tetiklemek

Gerçek bir cron görevinin yapması gereken şey komut satırından çağırmaktır:

php /kurulum/yolu/cron.php

Kabuk erişimi olmayan sunucularda HTTP üzerinden tetikleyebilirsiniz. Sır adres satırında değil başlıkta taşınır, çünkü adres satırındaki her şey erişim kayıtlarına, tarayıcı geçmişine ve Referer başlığına sızar:

curl -s -H "X-Cron-Secret: CRON_TOKEN_DEGERINIZ" https://siteniz.com/cron.php

Jeton, yapılandırmanızdaki CRON_TOKEN sabitidir ve karşılaştırma sabit zamanlı yapılır. Jetonsuz istek 403 forbidden alır, hiçbir şey çalışmaz. Dış cron servisleri (cron-job.org ve benzerleri) özel başlık gönderebiliyor; gereken tek şey de bu.

Bir de anahtar istemeyen https://siteniz.com/cron.php?tick=1 adresi var. Bu uç bilerek zararsız tutuldu: PseudoCron'un kendi kendini çağırdığı adres odur, dosya kilidinin arkasında dakikada bir kezle sınırlıdır ve gerçek bir cron tazelik bayrağını sıcak tutuyorsa hiç iş yapmadan {"ok":true,"skipped":"real-cron"} döner. Kimlik doğrulamalı tetiğin yerini tutmaz.

Bir şey takıldığında

Komut satırı turu her adım için bir satır basar. En hızlı teşhis, turu elle koşturup çıktıyı okumaktır:

php /kurulum/yolu/cron.php

Önce [cron 2026-09-13T…] satırını, sonra iş yapan her adım için bir satır, en sonda da done görürsünüz. Bunun yerine skipped: previous run still active çıkıyorsa önceki turun kilidi hâlâ duruyordur - genellikle bir yedek ya da büyük bir posta grubu yüzünden, arada bir de sert kapanmadan kalan bayat kilit yüzünden.

Sorun zamanlanmış yazılardaysa, zamanlayıcıdan şüphelenmeden önce iki şeye bakın: yazının kendi scheduled_at değeri ve Ayarlar → Genel → Yerelleştirme altındaki saat diliminiz. "Bir saat geç yayınlandı" bildirimlerinin çoğunun arkasından saat dilimi uyuşmazlığı çıkar.

Yeniliklerden ilk sen haberdar ol

Yeni özellikler, sürüm notları ve CMS rehberleri. Ayda birkaç e-posta gönderiyoruz.