CPanel'de Manuel Olarak Çalıştırdığım PHP Scripti, Cron Job Olarak Ayarlandığında Neden Hata Veriyor veya Hiç Çalışmıyor?

0

Bir süredir üzerinde çalıştığım ve web sitemdeki belirli verileri güncelleyen bir php scriptim var. Bu scripti SSH üzerinden veya tarayıcıdan doğrudan çağırdığımda sorunsuz bir şekilde çalışıyor ve beklenen işlemi tamamlıyor. Ancak, aynı scripti CPanel'deki Cron İşleri bölümünden günlük olarak çalışacak şekilde ayarladığımda, ya hiçbir çıktı vermiyor ya da beklenmedik hatalar döndürüyor. Cron loglarına baktığımda genellikle boş bir çıktı görüyorum veya bazen 'command not found' gibi, manuel çalıştırdığımda karşılaşmadığım hatalarla karşılaşıyorum. PHP yolunu, script yolunu defalarca kontrol ettim, hatta farklı PHP versiyonlarını denedim ama sonuç değişmedi. Sanki cron ortamı, manuel çalışma ortamından farklı bir yapıya sahip gibi geliyor. Özellikle @yusuf_kurt65'in CPanel'de Dosya Yöneticisi'nden Yüklediğim PHP Dosyası Neden Çalışmıyor? (Kaynakta belirtildiği gibi) konusundaki deneyimi aklıma takıldı; acaba benim de dosya izinleri veya ortam değişkenleriyle ilgili bir sorunum mu var? Bu durumu daha önce yaşamış veya çözüm bulmuş birileri var mı?

Cevaplar (1)

1

CPanel'de manuel olarak sorunsuz çalışan bir PHP script'in cron işi olarak ayarlandığında hata vermesi veya hiç çalışmaması, saha tecrübelerimize göre oldukça yaygın bir durumdur. Bu, çoğunlukla cron ortamının kendi içindeki farklılıklarından, özellikle de ortam değişkenleri ve çalışma dizini yönetiminden kaynaklanır. Aşağıdaki adımları uygulayarak bu sorunu çözebilirsin.

Hazırlık ve Gereksinimler:

  • CPanel yönetici paneline erişim.
  • Çalıştırmak istediğin PHP script dosyasının sunucu üzerindeki Tam yolu (örneğin: /home/kullaniciadi/public_html/dizin/script.php).
  • Sunucundaki PHP CLI (Command Line Interface) yorumlayıcısının Tam yolu (genellikle /usr/local/bin/php veya cPanel'in MultiPHP Manager'ına göre /opt/alt/phpXX/usr/bin/php gibi bir yol).

Adım Adım uygulama:

Adım 1: PHP CLI Yorumlayıcısının Tam Yolunu Belirle

Cron ortamı, genellikle `php` komutunu PATH değişkeninde bulamayabilir. Bu yüzden, PHP yorumlayıcısının sunucu üzerindeki tam yolunu bilmen ve kullanman şarttır. SSH erişimin varsa, aşağıdaki komutla kolayca bulabilirsin:

Which php

Veya farklı PHP versiyonlarını kullanan bir cPanel kurulumunda, hangi versiyonu kullanmak istediğine bağlı olarak şöyle bir komut işe yarayabilir:

/usr/local/bin/ea-php --version

Bu komutlar sana `/opt/alt/php74/usr/bin/php` benzeri bir çıktı verecektir. Bu yolu not al.

Adım 2: Script'in Çalışma Dizinini Ayarla ve Mutlak Yollar Kullan

Cron işleri varsayılan olarak genellikle kullanıcının ana dizininde (`/home/kullaniciadi`) çalışır. Eğer script'in içinde göreceli (relative) yollarla başka dosyalara (`include`, `require`) veya kaynaklara erişiyorsa, cron bu dosyaları bulamaz. Bu durumu aşmak için cron komutunda script'in bulunduğu dizine geçiş yapmalısın.

Script'in tam yolu /home/kullaniciadi/public_html/dizin/script.php ise, çalışma dizini /home/kullaniciadi/public_html/dizin olacaktır.

Adım 3: Cron Komutunu Oluştur ve Hata Ayıklama İçin Loglama Yapılandır

En sağlam cron komutu şu formatta olmalıdır:

Cd /home/kullaniciadi/public_html/dizin; /opt/alt/php74/usr/bin/php script.php > /home/kullaniciadi/cron-log.log 2>&1
  • Cd /home/kullaniciadi/public_html/dizin;: Bu kısım, cron işi başlamadan önce script'in bulunduğu dizine geçiş yapılmasını sağlar. Böylece script içindeki göreceli yollar doğru çalışır.
  • /opt/alt/php74/usr/bin/php: Adım 1'de bulduğun PHP CLI yorumlayıcısının tam yolu.
  • Script.php: Çalıştırılacak PHP script dosyasının adı. Artık doğru dizinde olduğun için tam yola gerek yoktur.
  • > /home/kullaniciadi/cron-log.log 2>&1: Bu kısım hayati öneme sahiptir. Script'in tüm çıktılarını (hem standart çıktısını hem de hata çıktılarını) belirtilen log dosyasına yönlendirir. Böylece script'in neden çalışmadığını veya hangi hatayı verdiğini bu dosyayı kontrol ederek görebilirsin.

Adım 4: CPanel Cron İşlerine Ekle

CPanel'e giriş yap, 'Cron İşleri' bölümüne git. Zamanlamayı (dakika, saat, gün, ay, hafta içi) script'inin çalışma sıklığına göre ayarla. 'Komut' alanına Adım 3'te oluşturduğun komutu yapıştır ve 'Yeni Cron İşi Ekle' düğmesine tıkla.

Dikkat Edilmesi Gerekenler:

  • Script İçi Yollar: PHP script'inin içinde başka dosyaları `include` veya `require` ile çağırırken de mutlak yollar kullanmaya özen göster veya script'in başında `chdir(__DIR__);` veya `define('ROOT_PATH', __DIR__);` gibi ifadelerle kök dizini tanımla.
  • PHP Limitleri: Cron ortamında PHP'nin bellek (`memory_limit`) ve çalışma süresi (`max_execution_time`) limitleri, web ortamından farklı olabilir. Eğer script'in büyük işlemler yapıyorsa, bu limitleri script içinde `ini_set()` fonksiyonu ile artırmayı düşünebilirsin.
  • Dosya İzinleri: Script dosyasının ve üzerinde işlem yaptığı dizinlerin doğru okuma/yazma izinlerine sahip olduğundan emin ol (genellikle 644 veya 755 yeterlidir).

Sonuç:

Bu adımları eksiksiz uyguladığında, PHP script'in cron işi olarak atandığında, manuel çalışmada karşılaştığın sorunları yaşamadan, doğru ortamda ve belirtilen zamanlarda stabil bir şekilde çalışacaktır. Özellikle log dosyası, olası sorunlarda sana yol gösterecek en önemli araç olacaktır.

Aklına Takılabilir:

  • `command not found` hatası sürekli çıkıyor, ne yapmalıyım? PHP yorumlayıcısının tam yolunu doğru yazdığından ve sunucuda o yolda bir PHP CLI bulunduğundan emin olmalısın.
  • Log dosyası boş veya oluşmuyor, neden? Cron komutundaki loglama kısmını (`> /home/kullaniciadi/cron-log.log 2>&1`) kontrol et ve log dosyasının yazılacağı dizine yazma iznin olduğundan emin ol.

Kullanıcılar