Cron Kurulumu Derinlemesine
Cron, sunucunuza "her dakika şu dosyaya uğra" demenin yoludur. jekcms'in arka plan işleri (zamanlanmış yayın, AI worker, yedek rotasyonu, sitemap güncellemesi) bu dakika tiklerine bağlı çalışır. Zamanlanmış Görevler sayfası kavramı anlatıyor; bu sayfa ise sunucu tipinize göre uygulamalı kurulum rehberidir.
Cron kurmak zorunda değilsiniz
v2.26.0 itibarıyla zamanlanmış yayın, hiç cron kurmadan kutudan çıktığı gibi çalışır. jekcms "sıradaki işin zamanı" damgasını tutar ve o an geldiğinde yayın motorunu, sayfa yanıtı ziyaretçiye teslim edildikten hemen sonra çalıştırır — 14:37'ye kurduğunuz yazı, 14:37 ve sonrasındaki ilk ziyarette yayına girer; o ziyaretçi de bunu hiç beklemez. Model WordPress'inkiyle aynı, ama şansa değil hesaba dayalı: normal bir istekte maliyeti bir-iki küçük dosya okumasından ibarettir.
Dürüst tek sınır WordPress'le ortak: siteye hiç kimse uğramıyorsa (kendi yönetici ziyaretleriniz dahil) hiçbir şey tetiklenemez. Siteniz yepyeni ve ziyaretçisizse ya da dakikası dakikasına garanti istiyorsanız aşağıdaki gibi gerçek bir cron kurun — gerçek cron kuruluysa ziyaretçi-tetiklemeli zamanlayıcı bunu fark eder ve kendini tamamen kapatır. Her koşulda kapatmak isterseniz yapılandırmanızda JEK_DISABLE_PSEUDO_CRON sabitini true tanımlayın.
Ne sıklıkta çalışmalı?
Önerimiz her 1 dakikada bir. Düşük trafikli sitelerde 5 dakikaya çıkarabilirsiniz ama zamanlanmış yayınlarda görünür bir gecikmeye sebep olur — "10:00'da yayınlansın" dediğiniz yazı 10:04'te yayınlanabilir. AI toplu işçisi için 15+ dakika çok yavaştır, kullanıcı ilerleme sayfasında "takıldı" sanır.
cPanel (paylaşımlı sunucu)
Barındırıcınız büyük ihtimalle cPanel kullanıyor. Giriş yaptıktan sonra Advanced → Cron Jobs sayfasını açın.
Add New Cron Job altında:
- Common settings: "Once per minute" seçin (ya da önhazır ayarlardan dakikalık olanı)
- Command:
/usr/bin/php /home/YOURUSER/public_html/cron.php >/dev/null 2>&1
YOURUSER ve yolu kendi kurulumunuza göre değiştirin. Sunucunuzda /usr/bin/php yoksa /usr/local/bin/php veya /opt/cpanel/ea-php82/root/usr/bin/php deneyin. cPanel'in "Terminal" aracınız varsa which php komutu size doğru yolu söyler.
Sondaki >/dev/null 2>&1 kısmı çıktıyı susturur. Bunu koymazsanız cPanel her dakika size e-posta gönderir ve gelen kutunuz bir günde dolar.
Plesk
Tools & Settings → Scheduled Tasks → Add Task.
- Task type: Run a command
- Command:
php /var/www/vhosts/yourdomain.com/httpdocs/cron.php - Run: Her dakika
- Send notifications: "Only on errors" seçin (yoksa yine e-postanız taşar)
Kaydettikten sonra bir kez Run Now'a tıklayın — bir dakika beklemeden komutun gerçekten çalıştığını doğrulamış olursunuz.
DirectAdmin
Advanced Features → Cron Jobs. Biçim cPanel ile aynı:
* * * * * /usr/bin/php /home/USER/domains/yourdomain.com/public_html/cron.php >/dev/null 2>&1
Kendi Linux sunucunuz (crontab)
VPS ya da özel sunucuysa, web kullanıcısının crontab'ını düzenleyin. Root kullanıcısını değil:
sudo -u www-data crontab -e
(Dağıtımınıza göre nginx, apache veya kurulumun sahibi olan kullanıcı olabilir.)
Sonra şunu ekleyin:
* * * * * cd /var/www/jekcms && /usr/bin/php cron.php >> storage/logs/cron.log 2>&1
Başta cd yapmak önemli — bazı PHP include'ları çalışma dizininin kurulum kökü olduğunu varsayar. Çıktıyı log dosyasına yönlendirmek de ileride hata ayıklarken iz bırakmış olur.
systemd timer (Linux, crontab yerine)
Sistem yöneticisiyseniz ve systemd tarafında kalmayı tercih ediyorsanız iki dosya yaratırsınız.
/etc/systemd/system/jekcms-cron.service:
[Unit]
Description=jekcms cron tick
[Service]
Type=oneshot
User=www-data
WorkingDirectory=/var/www/jekcms
ExecStart=/usr/bin/php cron.php
/etc/systemd/system/jekcms-cron.timer:
[Unit]
Description=Run jekcms cron every minute
[Timer]
OnCalendar=*:0/1
Persistent=true
[Install]
WantedBy=timers.target
Sonra:
sudo systemctl daemon-reload
sudo systemctl enable --now jekcms-cron.timer
systemctl list-timers | grep jekcms
Crontab'a göre avantajı: journalctl -u jekcms-cron ile düzgün log okursunuz, yeniden başlatmalarda sorun çıkmaz, kullanıcı başına crontab karmaşası yok.
Windows Task Scheduler
XAMPP, WAMP ya da IIS ile çalışıyorsanız:
- Task Scheduler → Create Task açın (dikkat: "Basic Task" değil, çünkü dakikalık tetikleyici için tam diyaloğa ihtiyacınız var)
- General sekmesinde: ad olarak "jekcms cron" yazın, "Run whether user is logged on or not" işaretleyin
- Triggers → New: "Daily" seçin, bugün başlasın, "Repeat task every 1 minute", "for a duration of 1 day", "Enabled" işaretli
- Actions → New:
- Program: C:\xampp\php\php.exe - Arguments: C:\xampp\htdocs\jekcms\cron.php - Start in: C:\xampp\htdocs\jekcms
- Conditions sekmesinde "Start only if on AC power" işaretini kaldırın (aksi halde dizüstü bilgisayarda fiş çekilince cron durur)
- Settings sekmesinde "Run task as soon as possible after a scheduled start is missed" işaretleyin
Kaydettikten sonra göreve sağ tıklayıp Run deyin — zamanlamaya güvenmeden önce elle çalışıp çalışmadığını bir kontrol etmiş olursunuz.
Gerçekten çalıştığını nasıl anlarım?
Üç ayrı yoldan kontrol edebilirsiniz.
1. Admin panel: Automation → Scheduled Tasks sayfasını açın. Her yerleşik görevin son çalışma zamanı son bir iki dakika içinde olmalı. Hepsi saatler öncesini gösteriyorsa cron çalışmıyor demektir.
2. Log dosyası: Çıktıyı storage/logs/cron.log'a yönlendirdiyseniz şunu çalıştırın:
tail -f storage/logs/cron.log
Her dakika yeni satır görmelisiniz. Yoksa cron cron.php'yi hiç çağırmıyor demektir.
3. DB sorgusu: Daha teknik bir yol:
SELECT name, last_run_at, TIMESTAMPDIFF(SECOND, last_run_at, NOW()) AS age
FROM scheduled_tasks
ORDER BY age DESC;
Bir görevin yaşı (saniye olarak) kendi aralığından büyükse cron bozuktur ya da o görev bir yerde takılmıştır.
Cron hiç çalışmazsa ne olur?
jekcms'in bir yedeği var: sitenize gelen ziyaretçi isteklerinin yaklaşık %2'sinde küçük bir kod parçası devreye girer ve süresi geçmiş bir görevi çalıştırır. Bilerek olasılıksal — zamana duyarlı işlere güvenemezsiniz, ama cron'u hiç olmayan bir siteyi tamamen ölümden kurtarır.
Bunun pratik sonuçlarına bakalım:
- Düşük trafikli site (günde 50 ziyaretten az): yedek neredeyse hiç tetiklenmez, zamanlanmış yazılarınız sonsuza kadar "scheduled" durumunda bekler. Gerçek cron kurun.
- Orta trafikli site (günde 100-1000 ziyaret): çoğu görev makul bir pencere içinde tıklar ama AI worker acı verici derecede yavaş olur.
- Yüksek trafikli site (günde 10k+ ziyaret): yedek, site neredeyse normal hissedilecek kadar sık tetiklenir — ama trafik anlık olarak düştüğünde işler takılır.
Yedek bir güvenlik ağı olarak var, ana plan olarak değil. Hobi sitesinin ötesinde bir şey işletiyorsanız gerçek cron kurun.