Cron ile Fonksiyon Çalıştırma

DLE’de zamanlanmış işler iki ayrı mekanizma ile yürütülür ve bunlar birbirinin yerini tutmaz. Biri sunucu tarafından belirli saatte tetiklenen harici cron (cron.php), diğeri siteye trafik geldikçe kendiliğinden çalışan iç cron (engine/modules/cron.php)’dur. İkisini karıştırmak, “görev neden çalışmadı?” sorusunun en yaygın nedenidir.

KonuAyrıntı
Harici cron dosyasıcron.php — site kökünde
Harici cron tetikleyiciSunucu zamanlaması (crontab) veya elle çalıştırma
Harici cron anahtarı$allow_cron — varsayılan 0 (kapalı)
İç cron dosyasıengine/modules/cron.php
İç cron tetikleyiciengine/init.php — her sayfa yüklemesinde kontrol
İç cron verisiset_vars("cron", …) / get_vars("cron") — engine/data/
!
İki mekanizma aynı şey değildir Harici cron sunucu saatine bağlıdır: iş, sizin belirlediğiniz saatte çalışır. İç cron ise ziyaretçi trafiğine bağlıdır: site hiç ziyaret almazsa hiç çalışmaz. Zaman kritik işler (yedek, sitemap, bülten) için harici cron tercih edilmelidir.

A) Harici cron — kökteki cron.php

Bu dosya, sunucu zamanlayıcısı (crontab) tarafından çağrılmak üzere tasarlanmıştır. Seçilen görevi yerine getirir; ancak açıkça izin verilmeden çalışmaz.

DeğişkenAnlamı
$allow_cronDosyanın başındaki anahtar. Varsayılan 0 — yani kapalıdır. Açılmadan çağrılırsa HTTP 403 ve Cron not allowed yanıtı döner.
$max_count_filesSunucuda saklanacak veritabanı yedeği sayısı (varsayılan 5).
!
Dosya adını değiştirin Dosyanın kendi içindeki uyarı notu da bunu söyler: güvenlik için cron.php adının başka bir .php adına değiştirilmesi önerilir. Ad tahmin edilemez olduğunda dışarıdan rastgele tetiklenme riski azalır.
!
Bu dosyada kimlik doğrulaması yoktur Dosya açıldığında hiçbir kimlik doğrulaması yapılmaz; adresini bilen herkes çalıştırabilir (yedek alma, yedek silme, tarama başlatma vb.). Ayrıca betik, çalışma anında $_REQUEST, $_POST ve $_GET dizilerini boşaltır; $_REQUEST['user_hash'] = 1 ve $dle_login_hash = 1 atayarak içeride bir yönetici bağlamı kurar ve kendi CSRF denetimlerini atlar. Bu nedenle dosya yalnızca güvenilen bir yerden çalıştırılmalıdır.

Görev modları

Görev bir parametre ile seçilir. Parametre verilmezse varsayılan görev backup’tır. İzin verilen görevler:

GörevNe yapar?
backupVeritabanı yedeği alır. Parametre verilmezse çalışan varsayılan görevdir. Saklanan yedek sayısı $max_count_files ile sınırlıdır.
sitemapSitemap üretir.
optimizeOptimizasyon işlemini yürütür.
antivirusAntivirüs taramasını çalıştırır.
newsletterBülten görevini yürütür. İlgili ayarın açık olmasına bağlıdır: bültenin cron yöntemiyle yapılandırılmış olması gerekir.

Çalıştırma biçimleri

Görev parametresi hem ?cronmode= sorgu parametresiyle hem de komut satırı argümanı olarak verilebilir.

YöntemÖrnek
Komut satırıphp cron.php · php cron.php sitemap
Tarayıcı / GEThttps://site.com/cron.php?cronmode=sitemap

Sunucu zamanlaması (crontab) ile otomatik çalıştırma örnekleri aşağıdadır. Yolları kendi sunucunuza göre değiştirmeniz gerekir.

# Günlük yedek (varsayılan görev: backup) — her gün 04:00
0 4 * * * /usr/bin/php /path/to/cron.php

# Sitemap üretimi — her gün 05:00
0 5 * * * /usr/bin/php /path/to/cron.php sitemap

Harici cron güvenliği

  • Dosya adını tahmin edilemez bir .php adıyla değiştirin.
  • İşi tercihen yalnızca sunucudan (crontab) çağırın.
  • HTTP erişimini kısıtlayın (örneğin .htaccess ile engelleme veya erişim filtreleri).
  • $allow_cron anahtarını yalnızca gerçekten kullanacaksanız açın.

B) İç cron — engine/modules/cron.php

İç cron ayrı bir ayar anahtarıyla denetlenmez. engine/init.php içinden her sayfa yüklemesinde kontrol edilir. Durum bilgisi, engine/data/ altındaki cron veri dosyasında set_vars("cron", …) / get_vars("cron") ile tutulur.

İç cron çalışma mantığı

KoşulSonuç
Kayıtlı zaman yoksa veya gün değiştiyse$cron = 2
Son çalışmadan bu yana 2 saatten fazla geçtiyse$cron = 1
$cron sıfırdan farklıysaİç cron çalıştırılır
Çalışma öncesi kilitlocked = true işaretlenir ve lasttime tutulur; 120 saniyelik zaman aşımı ile üst üste/paralel çalışma engellenir

İç cron’un yaptığı işler süresi dolmuş haberleri işlemek (PREFIX_post_log tablosundaki expires alanı) ve gerektiğinde haber önbelleğini temizlemektir. İşlemler, USERPREFIX_admin_logs tablosuna dle_cron_auto adıyla yazılır.

!
İç cron trafiğe bağımlıdır İç cron yalnızca siteye trafik geldikçe çalışır. Düşük trafikli sitelerde görevler gecikir; bu yüzden zaman kritik işler için harici cron tercih edilmelidir.

İki mekanizmanın karşılaştırması

ÖzellikHarici cron (cron.php)İç cron (engine/modules/cron.php)
TetikleyiciSunucu zamanlaması (crontab)Her sayfa yüklemesi
ZamanlamaBelirlediğiniz saatGün değişimi veya 2 saat aşımı
Yaptığı işYedek, sitemap, optimize, antivirüs, bültenSüresi dolmuş haberler, haber önbelleği temizliği
Trafik gerekir mi?HayırEvet

Sunucu panelinden zamanlama

Harici cron’u kurmak için sunucu kontrol panelinizin cron / planlı görevler bölümünü veya doğrudan crontab’ı kullanabilirsiniz. Zamanlama ifadesi (örn. 0 4 * * *) ve çalıştırılacak komut (php, dosya yolu ve isteğe bağlı görev parametresi) ilgili alanlara girilir. Menü adları sağlayıcıya göre değişir; kesin yol sunucudan sunucuya farklıdır.

Sık yapılan hatalar

HataSonuç
$allow_cron açmadan harici cron’u çağırmakHTTP 403 ve Cron not allowed döner
İç cron’un harici cron yerini tutacağını sanmakDüşük trafikte görevler hiç çalışmaz
Harici cron dosyasını tahmin edilebilir adla bırakmakAdresi bilen herkes çalıştırabilir; güvenlik açığı oluşur
Geçersiz görev adı vermekİzin verilen görevler dışındaki değerler işlenmez
Yedeği sınırsız sanmakSaklanan yedek sayısı $max_count_files ile sınırlıdır

Kontrol listesi

  • Harici cron ile iç cron’un iki ayrı mekanizma olduğunu ayırt edebiliyorum.
  • Harici cron kullanacaksam $allow_cron durumunu bilerek ayarladım.
  • Harici cron dosyasının adını değiştirdim ve erişimini kısıtladım.
  • Çalıştırılacak görevi (backup, sitemap, optimize, antivirus, newsletter) doğru seçtim.
  • Zamanlanmış görevlerde dosya yolunu ve php komutunu sunucuma göre düzenledim.
  • İç cron’un trafiğe bağlı çalıştığını ve işlerini (süresi dolmuş haberler, önbellek) biliyorum.