Cron job çalışmıyorsa PHP yolu, mutlak dosya yolu, izinler, log çıktısı ve sunucu zamanlamasını adım adım kontrol ederek hatayı hızlıca tespit edin.
Cron job tanımlandığı halde çalışmıyorsa sorun çoğu zaman zamanlama ifadesinden değil, komut yolundan, çalıştırma kullanıcısından veya dosya izinlerinden kaynaklanır. Özellikle paylaşımlı hosting ortamlarında PHP yolu, proje dizini ve güvenlik kısıtları sunucudan sunucuya değişebilir. Bu nedenle kontrolü rastgele denemelerle değil, adım adım ve çıktıyı doğrulayarak yapmak gerekir.
Cron görevleri arka planda çalıştığı için hata ekranda görünmez. Komut elle çalıştırıldığında sorunsuz görünebilir, ancak cron farklı bir ortam değişkeni, farklı kullanıcı ve sınırlı PATH bilgisiyle çalışır. Bu farklar; yanlış PHP yolu, eksik dosya izni, göreceli dizin kullanımı veya yazma yetkisi olmayan klasörler gibi hatalara yol açar.
İlk kontrol edilmesi gereken nokta, cron komutunun sunucuda gerçekten hangi kullanıcıyla çalıştığıdır. Kontrol panelinden eklenen görevler genellikle ilgili hesap kullanıcısıyla çalışır. SSH üzerinden root veya farklı bir kullanıcıyla test yapmak, yanıltıcı sonuç verebilir.
Cron içinde komut yazarken mümkün olduğunca tam yol kullanılmalıdır. Çünkü cron, terminal oturumundaki çevresel değişkenleri aynı şekilde yüklemeyebilir. Örneğin sadece php script.php yazmak yerine PHP yorumlayıcısının ve çalıştırılacak dosyanın tam yolu belirtilmelidir.
/usr/bin/php /home/kullanici/public_html/cron/islem.php
PHP yolunu bilmiyorsanız SSH erişiminde aşağıdaki komutla kontrol edebilirsiniz:
which php
Kontrol paneli kullanan sistemlerde farklı PHP sürümleri için özel yollar bulunabilir. Örneğin uygulama PHP 8.2 ile çalışırken cron varsayılan PHP 7.4 ile tetiklenirse beklenmeyen hatalar oluşabilir. Bu durumda paneldeki PHP selector, MultiPHP veya benzeri alandan CLI PHP yolunu kontrol etmek gerekir.
Script içinde include, require veya dosya okuma işlemleri varsa göreceli yollar cron altında bozulabilir. Bunun yerine uygulama kök dizinini sabitlemek daha güvenlidir.
require __DIR__ . '/ayarlar.php';
Bu kullanım, cron hangi dizinden çalışırsa çalışsın aynı dosyayı çağırır. WordPress, Laravel veya özel yazılım projelerinde cron hatalarının önemli bir bölümü bu küçük farktan kaynaklanır.
Cron görevinin çalıştıracağı dosyanın okunabilir, gerekiyorsa çalıştırılabilir olması gerekir. PHP dosyaları için çoğu senaryoda 644, klasörler için 755 izni yeterlidir. Ancak log yazılan, cache üreten veya çıktı dosyası oluşturan klasörlerde yazma izni de gerekir.
SSH üzerinden izinleri görüntülemek için şu komut kullanılabilir:
ls -la /home/kullanici/public_html/cron/
Burada dosya sahibi ve grup bilgisi de önemlidir. Dosya başka bir kullanıcıya aitse, cron dosyayı okuyamayabilir veya oluşturulan log dosyasına yazamayabilir. Bu durum özellikle taşıma yapılan hosting hesaplarında sık görülür.
Cron job çalışmıyorsa en hızlı teşhis yöntemi çıktıyı bir log dosyasına yönlendirmektir. Böylece hata mesajı, izin problemi veya PHP uyarısı doğrudan görülebilir.
/usr/bin/php /home/kullanici/public_html/cron/islem.php >> /home/kullanici/cron.log 2>&1
Bu komutta standart çıktı ve hata çıktısı aynı log dosyasına yazılır. Log dosyası oluşmuyorsa dizin yolu yanlış olabilir veya kullanıcının yazma izni yoktur. Log oluşuyor ancak boş kalıyorsa script hiç çıktı üretmiyor olabilir; geçici olarak ekrana yazı basan basit bir test satırı eklemek faydalıdır.
Komut ve izinler doğruysa cron zamanlaması kontrol edilmelidir. Örneğin her 5 dakikada bir çalışması gereken görev için ifade şu şekilde olmalıdır:
*/5 * * * * /usr/bin/php /home/kullanici/public_html/cron/islem.php
Sunucu saat dilimi de dikkate alınmalıdır. Kontrol panelinde yerel saat gösterilse bile cron, sunucu saatine göre çalışabilir. Zaman hassasiyeti olan e-posta, yedekleme veya raporlama işlemlerinde bu fark yanlış teşhis yapılmasına neden olur.
Bazı sistemlerde cron, PHP dosyasını doğrudan çalıştırmak yerine bir URL çağırır. Bu yöntemde wget veya curl kullanılır. Ancak güvenlik duvarı, HTTP kimlik doğrulama, bakım modu veya IP kısıtı çağrıyı engelleyebilir.
/usr/bin/curl -s https://example.com/cron/islem.php
URL ile çalıştırma gerekiyorsa dosya herkese açık olmamalı, tahmin edilmesi zor bir anahtar veya IP kısıtı kullanılmalıdır. İşlem kritikse doğrudan CLI üzerinden çalıştırmak genellikle daha güvenli ve daha kararlıdır.
Bu kontrollerden sonra görev hâlâ tetiklenmiyorsa aynı komutu cron kullanıcısı ile SSH üzerinden çalıştırmak en net testtir. Komut terminalde hata veriyorsa sorun cron tanımında değil, komutun çağırdığı dosya, bağımlılık veya yetki yapısındadır. Yönetilen sunucu veya kurumsal hosting altyapılarında erişim kısıtları bulunabileceği için, hata çıktısıyla birlikte teknik destek ekibine başvurmak çözümü hızlandırır.