![]() |
|
Cron Job Çalışmıyor: Önce Neyi Kontrol Etmek Gerekir? - Yazdırılabilir Versiyon +- Dataweb Forum (https://dataweb.com.tr/forum/hosting-sunucu) +--- Konu: Cron Job Çalışmıyor: Önce Neyi Kontrol Etmek Gerekir? (/https://dataweb.com.tr/forum/cron-job-calismiyor-once-neyi-kontrol-etmek-gerekir-46) |
Cron Job Çalışmıyor: Önce Neyi Kontrol Etmek Gerekir? - Kadir - 09-02-2026 Cron görevi panelde kayıtlı görünüyor ama hiçbir şey olmuyorsa “cron çalışmıyor” demeden önce sorunu katman katman ayırmak gerekir. Amaç şu üç soruyu ayrı ayrı cevaplamak: Kod: 1. Zamanlayıcı gerçekten tetikleniyor mu?
2. PHP/script gerçekten çalışabiliyor mu?
3. Script çalışıyor ama uygulama içinde mi hata veriyor?Aşağıdaki adımlar teknik bilmeyen birinin de sırayla uygulayabileceği şekilde hazırlanmıştır. 1) Cron gerçekten tetikleniyor mu? En basit dosya testi Önce uygulamanızı hiç çalıştırmadan yalnız cron servisinin tetiklenip tetiklenmediğini test edin. Yöntem A — PHP dosyasıyla test Dosya yöneticisinde sitenizin `public_html` klasörüne girin. Yeni bir dosya oluşturun: Kod: cron-test.phpİçine şunu yazın: Kod: <?php
file_put_contents(
__DIR__ . '/cron-test.log',
date('Y-m-d H:i:s') . PHP_EOL,
FILE_APPEND
);Kaydedin. Şimdi hosting panelindeki Cron Jobs bölümünde geçici bir görev oluşturun. Örneğin panel PHP türünü kendisi seçtiriyorsa: - PHP sürümü: sitenizle aynı sürüm - dosya: `public_html/cron-test.php` - zamanlama: her 5 dakikada bir Özel komut kabul ediyorsa örnek mantık: Kod: /usr/bin/php /home/KULLANICI/public_html/cron-test.phpBazı hostinglerde PHP yolu farklı olabilir; aşağıdaki 2. bölümde bunu nasıl bulacağımızı anlatıyorum. 5-10 dakika bekleyin. Dosya yöneticisini yenileyin. Şu dosya oluşmuş olmalı: Kod: cron-test.logİçini açın. Örnek: Kod: 2026-09-02 15:05:01
2026-09-02 15:10:01Bu satırlar oluşuyorsa cron zamanlayıcısı çalışıyor demektir. Artık sorun cron servisinde değil, asıl scriptinizdedir. Dosya hiç oluşmuyorsa: - komut yanlış, - PHP yolu yanlış, - dosya yolu yanlış, - cron henüz tetiklenmedi, - panel görevi kaydetmemiş olabilir. Test bitince `cron-test.php` ve `cron-test.log` dosyalarını silin. 2) Panelin kullandığı PHP / CLI yolu doğru mu? Web sitesinin PHP sürümü ile cron’un kullandığı komut satırı PHP’si aynı olmayabilir. Örneğin web siteniz PHP 8.3 çalıştırırken cron: Kod: /usr/bin/phpile PHP 8.1 çalıştırıyor olabilir. Hostinger benzeri panellerde Cron Job oluştururken “PHP” seçeneği varsa panel çoğu zaman PHP çalıştırıcısının ilk kısmını otomatik getirir. Örneğin: Kod: /opt/alt/php83/usr/bin/lsphpveya sunucuya göre: Kod: /usr/bin/phpgörebilirsiniz. Nereden bakılır? Hosting paneli → Gelişmiş / Advanced → Cron Jobs / Cron Görevleri. Mevcut cron kaydının “Komut” alanını açın. Şuna benzer bir yapı görmelisiniz: Kod: PHP_YOLU /home/KULLANICI/domains/site.com/public_html/script.phpPHP yolunu ayrıca SSH erişiminiz varsa doğrulayabilirsiniz: Kod: php -vve: Kod: which phpÖrnek çıktı: Kod: PHP 8.3.x (cli)
/usr/bin/phpBelirli bir yolu kontrol etmek için: Kod: /opt/alt/php83/usr/bin/lsphp -vveya: Kod: /usr/bin/php -vSSH yoksa ne yapacağız? Cron panelinin PHP seçeneğini kullanın. Panel PHP sürümü seçtiriyorsa elle farklı bir yol yazmak yerine önce o mekanizmayı tercih edin. Ayrıca geçici test dosyasına: Kod: <?php
file_put_contents(
__DIR__.'/php-cron-info.txt',
PHP_VERSION . ' | ' . PHP_SAPI
);yazıp cronla bir kez çalıştırabilirsiniz. Sonra `php-cron-info.txt` içinde cron’un gördüğü PHP sürümünü okuyabilirsiniz. Test dosyasını işiniz bitince silin. 3) Script elle çalıştırıldığında hata veriyor mu? Cron’u devreden çıkarıp asıl PHP dosyasını manuel çalıştırmak çok değerlidir. SSH varsa Önce klasöre gidin: Kod: cd /home/KULLANICI/domains/site.com/public_htmlSonra: Kod: /usr/bin/php yol/script.phpveya hostingin doğru PHP yolu neyse: Kod: /opt/alt/php83/usr/bin/lsphp yol/script.phpHata varsa terminalde görebilirsiniz. Komut bittikten sonra çıkış kodunu görmek için: Kod: echo $?Genelde `0` başarılı çalışmayı ifade eder; farklı değer script veya çalıştırma hatasına işaret edebilir. SSH yoksa Scriptiniz güvenli şekilde web üzerinden çalıştırılmak üzere tasarlanmışsa geçici olarak tarayıcıdan açılabilir. Ancak cron dosyanız yönetim işlemi yapıyorsa herkese açık bırakmayın. Örneğin uygulamanız token destekliyorsa: Kod: https://site.com/cron.php?token=UZUN_GIZLI_TOKENgibi korumalı bir test kullanılabilir. Token veya oturum kontrolü olmayan hassas cron dosyasını sırf test için herkese açık hale getirmeyin. 4) Çalışma dizini yüzünden relative path kırılıyor mu? Web üzerinden çalışan kod: Kod: require 'app/bootstrap.php';ile çalışırken cron farklı klasörden başlatıldığında dosyayı bulamayabilir. Daha güvenli yaklaşım: Kod: require __DIR__ . '/app/bootstrap.php';veya dosya alt klasördeyse: Kod: require dirname(__DIR__) . '/app/bootstrap.php';Yani mümkün olduğunca `__DIR__` kullanın. Alternatif olarak cron komutunda önce klasöre geçebilirsiniz: Kod: cd /home/KULLANICI/domains/site.com/public_html && /usr/bin/php yonetim/cron.php5) Hata çıktısını log dosyasına nasıl yazdırırım? Cron paneli çıktıyı göstermiyorsa stdout ve stderr’i dosyaya yönlendirin. Örnek: Kod: /usr/bin/php /home/KULLANICI/public_html/cron.php >> /home/KULLANICI/cron-debug.log 2>&1Buradaki: Kod: >>çıktıyı dosyanın sonuna ekler. Kod: 2>&1hata çıktısını da aynı dosyaya gönderir. Tarih de görmek istiyorsanız: Kod: date >> /home/KULLANICI/cron-debug.log
/usr/bin/php /home/KULLANICI/public_html/cron.php >> /home/KULLANICI/cron-debug.log 2>&1Ancak hosting panelinde komut uzunluğu sınırı olabilir. Böyle durumda ayrı bir shell wrapper veya PHP içi loglama tercih edilir. 6) PHP error log nereden kontrol edilir? Hosting panelinde şu isimleri arayın: - Error Logs - PHP Errors - Logs - Hata Günlükleri Dosya yöneticisinde de şu dosyalar bulunabilir: Kod: error_log
php_error.log
logs/Hata zamanını cron’un çalışması gereken saatle karşılaştırın. Örneğin: Kod: PHP Fatal error: Uncaught mysqli_sql_exception...gibi bir kayıt varsa cron tetikleniyor fakat uygulama veritabanında çöküyor olabilir. 7) Veritabanı bağlantısı neden cron’da farklı davranabilir? Web request ile CLI aynı ortam değildir. Kontrol edin: - `.env` veya config dosyası doğru yükleniyor mu? - dosya yolu relative mı? - DB host `localhost` mı farklı socket mi kullanıyor? - CLI kullanıcısının gerekli dosyalara erişimi var mı? - hosting güvenlik politikası CLI bağlantısını sınırlıyor mu? Basit test için uygulamanızın bootstrap dosyasını yükleyip: Kod: SELECT 1sorgusu çalıştıran geçici tanı sayfası hazırlanabilir. Üretim verisini değiştirmeyen salt-okunur test tercih edin. 8) Kilit dosyası takılı kaldı mı? Aynı cron’un iki kez paralel çalışmasını önlemek için bazı scriptler lock file kullanır. Örnek: Kod: app/cron.lock
storage/cron.lock
/tmp/myapp-cron.lockScript başında kilit alınıyor ama hata sonrası bırakılmıyorsa sonraki tüm çağrılar “zaten çalışıyor” sanabilir. Kodu kontrol edin: - lock ne zaman oluşturuluyor? - `finally` içinde bırakılıyor mu? - eski lock için timeout var mı? Kilit dosyasını ne olduğunu bilmeden silmeyin. Önce scriptin gerçekten çalışmadığını doğrulayın. 9) Cron’un kendisi uzun sürüyor veya timeout oluyor olabilir mi? Cron işi: - büyük API çağrısı, - çok sayıda veritabanı kaydı, - dış web taraması yapıyorsa çalışma süresi uzayabilir. Script içine aşama logları ekleyin: Kod: [15:00:01] started
[15:00:02] database ok
[15:00:04] api request started
[15:00:30] api request completed
[15:00:31] finishedLog son olarak “api request started” satırında kalıyorsa sorunun hangi aşamada olduğunu anlarsınız. 10) Cron panelindeki boş çıktı ne anlama gelir? Boş ekran = kesinlikle “çalışmadı” değildir. Script: - hiç echo üretmiyor olabilir, - çıktıyı log dosyasına yönlendiriyor olabilir, - başarılı çalışıp sessiz bitiyor olabilir. Bu nedenle asıl kanıt: - heartbeat zamanı, - log satırı, - veritabanındaki son çalışma kaydı, - oluşturulan test dosyası gibi gözlemlenebilir bir sonuçtur. 11) Yeni başlayanlar için net teşhis sırası Aşağıdaki sırayı bozmayın:
12) Destek ekibine ne göndermeliyim? “Cron çalışmıyor” demek yerine şu bilgileri gönderin: Kod: Zamanlama:
*/15 * * * *
Komut:
PHP_YOLU /home/.../cron.php
PHP sürümü:
8.3
Basit tarih testi:
çalışıyor / çalışmıyor
Manuel çalıştırma:
başarılı / hata mesajı
Son log:
...
Son başarılı çalışma:
...Bu bilgiler sorunu çok daha hızlı daraltır. Güvenlik uyarısı Cron URL’nizde token varsa ekran görüntüsünde veya forum mesajında token’ın tamamını paylaşmayın. Şifre, veritabanı parolası, API anahtarı ve tam erişim tokenlarını mutlaka gizleyin. Sizde cron sorunu varsa ilk olarak 1. adımdaki `cron-test.php` testini yapın. Log dosyası oluşuyor mu, oluşmuyorsa paneldeki komutun yapısı nasıl? Gizli bilgileri kapatarak paylaşabilirsiniz. Dataweb editoryal sürüm: derin anlatım v1.0.0 |