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.
| Konu | Ayrıntı |
|---|---|
| Harici cron dosyası | cron.php — site kökünde |
| Harici cron tetikleyici | Sunucu zamanlaması (crontab) veya elle çalıştırma |
| Harici cron anahtarı | $allow_cron — varsayılan 0 (kapalı) |
| İç cron dosyası | engine/modules/cron.php |
| İç cron tetikleyici | engine/init.php — her sayfa yüklemesinde kontrol |
| İç cron verisi | set_vars("cron", …) / get_vars("cron") — engine/data/ |
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şken | Anlamı |
|---|---|
$allow_cron | Dosyanı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_files | Sunucuda saklanacak veritabanı yedeği sayısı (varsayılan 5). |
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.
$_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örev | Ne yapar? |
|---|---|
backup | Veritabanı 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. |
sitemap | Sitemap üretir. |
optimize | Optimizasyon işlemini yürütür. |
antivirus | Antivirüs taramasını çalıştırır. |
newsletter | Bü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ı / GET | https://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
.phpadıyla değiştirin. - İşi tercihen yalnızca sunucudan (crontab) çağırın.
- HTTP erişimini kısıtlayın (örneğin
.htaccessile engelleme veya erişim filtreleri). $allow_cronanahtarı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şul | Sonuç |
|---|---|
| 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 kilit | locked = 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.
İki mekanizmanın karşılaştırması
| Özellik | Harici cron (cron.php) | İç cron (engine/modules/cron.php) |
|---|---|---|
| Tetikleyici | Sunucu zamanlaması (crontab) | Her sayfa yüklemesi |
| Zamanlama | Belirlediğiniz saat | Gün değişimi veya 2 saat aşımı |
| Yaptığı iş | Yedek, sitemap, optimize, antivirüs, bülten | Süresi dolmuş haberler, haber önbelleği temizliği |
| Trafik gerekir mi? | Hayır | Evet |
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
| Hata | Sonuç |
|---|---|
$allow_cron açmadan harici cron’u çağırmak | HTTP 403 ve Cron not allowed döner |
| İç cron’un harici cron yerini tutacağını sanmak | Düşük trafikte görevler hiç çalışmaz |
| Harici cron dosyasını tahmin edilebilir adla bırakmak | Adresi 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 sanmak | Saklanan 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_crondurumunu 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
phpkomutunu sunucuma göre düzenledim. - İç cron’un trafiğe bağlı çalıştığını ve işlerini (süresi dolmuş haberler, önbellek) biliyorum.