Giriş: Hosting'de Cron Job Neden Gereklidir?
Web sitesi yönetimi dünyasında, birçok işlemin belirli zamanlarda otomatik olarak çalıştırılması gerekir. Veritabanının günlük yedeklenmesinden haber bülteni e-postalarının gönderilmesine, önbellek güncellemelerinden sipariş işlemlerine kadar. İşte bu noktada cron job devreye girer. Cron job, Linux işletim sistemlerinde, belirli zaman aralıklarında betikleri veya komutları çalıştırmanıza olanak tanıyan bir zamanlama aracıdır.
Paylaşımlı veya yönetilen hosting ortamlarında, genellikle cPanel, DirectAdmin veya Plesk gibi bir kontrol paneli bu özelliği sunar. Ancak sadece "Cron Job Ekle" düğmesine tıklamak yeterli değildir. Zamanlama yapısını yanlış girerseniz, PHP dosyasının yolunu hatalı yazarsanız veya hata çıktılarını göz ardı ederseniz, cron job'unuz ya çalışmaz ya da sessizce başarısız olur. Bu makalede, tam olarak nasıl verimli ve hata ayıklanabilir bir cron job oluşturacağınızı öğreneceksiniz.
Cron Job Zamanlama Yapısı: Sözdiziminden Uygulamaya
Her cron job'un kalbi, zamanlama ifadesidir (Cron Expression). Bu ifade, boşluklarla ayrılmış beş alandan oluşur:
* * * * * command_to_execute
| | | | |
| | | | +---- Haftanın günü (0-7) (0 ve 7 Pazar)
| | | +------ Ay (1-12)
| | +-------- Ayın günü (1-31)
| +---------- Saat (0-23)
+------------ Dakika (0-59)
Her alan bir sayı, bir aralık (örneğin 1-5), bir liste (örneğin 1,3,5) veya "tüm değerler" anlamına gelen bir yıldız (*) olabilir. Ayrıca adım (step) için / işaretini kullanabilirsiniz. Örneğin, dakika alanında */5 "her 5 dakikada bir" anlamına gelir.
Yaygın ve Kullanışlı Örnekler
- Her gün saat 3'te çalıştırma:
0 3 * * * - Her 15 dakikada bir çalıştırma:
*/15 * * * * - Her Pazartesi ve Perşembe saat 20:00'de çalıştırma:
0 20 * * 1,4 - Her ayın ilk günü çalıştırma:
0 0 1 * *
Önemli Not: Cron job'daki zaman, sunucunun saat dilimine (genellikle UTC) göre ayarlanır. Web siteniz İranlı kullanıcılar içinse ve Tahran saatine göre sabah 3'te çalışması gerekiyorsa, saat farkını (mevsime bağlı olarak genellikle +3:30 veya +4:30) hesaplamalısınız. Örneğin, kışın Tahran saatiyle sabah 3 için: 0 23 * * * (yani UTC 23:30).
PHP Yolunu Doğru Belirleme: En Yaygın Tuzak
Yeni başlayanların en büyük hatası, cron job'un tam olarak bir tarayıcı gibi çalıştığını varsaymaktır. Tarayıcıda, https://example.com/cron.php gibi bir adresi açarsınız ve sunucu dosyayı web sunucusu (Apache/Nginx) aracılığıyla çalıştırır. Ancak cron job doğrudan komut satırından (CLI) çalıştırılır ve HTTP veya web yolları hakkında hiçbir bilgisi yoktur.
Bu nedenle, cron job'a sunucu dosya sistemindeki dosyanın mutlak yolunu vermelisiniz. Bu yol genellikle /home/kullaniciadi/public_html/cron.php gibi bir şeydir. Tam yolu bulmak için kontrol panelini veya SSH'de pwd komutunu kullanabilirsiniz.
Cron Job'da PHP Çalıştırmak İçin Doğru Komut
En iyi yöntem, doğrudan PHP yorumlayıcısını çağırmak ve dosyanın yolunu ona vermektir. Çoğu hosting'de PHP CLI yolu /usr/local/bin/php veya /usr/bin/php gibidir. Nihai komut şu şekilde olacaktır:
/usr/local/bin/php /home/kullaniciadi/public_html/cron.php
PHP yolundan emin değilseniz, SSH'de which php komutunu kullanabilir veya hosting desteğinize sorabilirsiniz. cPanel kontrol panelinde, genellikle Cron Jobs bölümünde "PHP Path" adında bir seçenek bulunur ve yolu gösterir.
Yaygın Hata: PHP CLI Yerine wget veya curl Kullanmak
Bazı kişiler cron job'u wget -O /dev/null https://example.com/cron.php komutuyla çalıştırmaya çalışır. Bu yöntem çalışır, ancak bazı sorunları vardır:
- Web sunucusuna bağımlıdır. Web sunucusu bozulursa, cron job da çalışmaz.
- PHP'nin yürütme kısıtlamaları (örneğin
max_execution_time) uygulanır; CLI'da bu genellikle sınırsızdır. - Hata çıktıları kolayca kaydedilemez.
Her zaman PHP CLI yöntemini kullanmanızı öneririm, ancak HTTP kullanmak için özel bir nedeniniz varsa (örneğin, belirli bir çerez veya başlık gerekiyorsa) bu geçerli olabilir.
Hata Ayıklama İçin Çıktı Alma: Cron Job'um Neden Çalışmıyor?
En büyük zorluklardan biri, sessizce başarısız olan cron job'larında hata ayıklamaktır. Betiğiniz hata verdiğinde ancak çıktısı hiçbir yere kaydedilmediğinde, sorunu teşhis etmek çok zorlaşır. Neyse ki, standart çıktıyı (stdout) ve standart hataları (stderr) bir dosyaya yönlendirebilirsiniz.
Çıktıyı Günlük Dosyasına Yönlendirme
> ve 2>&1 operatörlerini kullanın. Aşağıdaki komut, normal çıktıyı ve hataları public_html klasöründeki cron.log dosyasına gönderir:
/usr/local/bin/php /home/kullaniciadi/public_html/cron.php >> /home/kullaniciadi/public_html/cron.log 2>&1
Operatörlerin açıklaması:
>>: Çıktıyı dosyanın sonuna ekler (append).>kullanırsanız, dosya her seferinde baştan yazılır.2>&1: Standart hataları (stderr), standart çıktının (stdout) gittiği yere yönlendirir. Yani her ikisi de aynı dosyaya kaydedilir.
Artık cron job her çalıştığında cron.log dosyasını açıp ne olduğunu görebilirsiniz. Dosya boşsa, betik hatasız çalışmıştır (veya hiç çalışmamıştır!). Bir hata varsa, dosyada tam olarak gösterilir.
Pratik Örnek: Veritabanı Yedekleme Betiği
Her gece saat 2'de MySQL veritabanınızın yedeğini almak istediğinizi varsayalım. backup.php betiğini /home/kullaniciadi/public_html/backup.php yoluna yerleştirdiniz. Cron job'unuz şu şekilde olmalıdır:
0 2 * * * /usr/local/bin/php /home/kullaniciadi/public_html/backup.php >> /home/kullaniciadi/public_html/backup.log 2>&1
backup.php dosyasının içinde, mysqldump komutunu çalıştırmak için exec() veya shell_exec() fonksiyonunu kullanın. Veritabanı kullanıcı adını ve şifresini mutlaka betiğin içine veya ayrı bir yapılandırma dosyasına koyun (ve bu dosyayı genel erişimden uzak tutun).
Gelişmiş Hata Ayıklama: Günlük Bile Yardımcı Olmadığında
Bazen günlük dosyası boştur ancak cron job çalışmaz. Bu durumlarda, birkaç şeyi kontrol edin:
- Dosya izinleri: PHP dosyanızın en az
644(herkes tarafından okunabilir) iznine sahip olduğundan emin olun. Betik bir dosyaya yazma gerektiriyorsa, hedef klasörün755veya777iznine sahip olması gerekir (ihtiyaca bağlı olarak). - Mutlak yol: SSH'de
ls -l /home/kullaniciadi/public_html/cron.phpkomutuyla dosya yolunu tekrar kontrol edin. Basit bir yazım hatası cron job'u çalışmaz hale getirebilir. - Bellek ve zaman sınırı: CLI ortamında,
memory_limitvemax_execution_timesınırları genellikle sınırsızdır, ancak betiğinizwgetile çalıştırılıyorsa, PHP-FPM sınırlamaları uygulanır. - Sistem günlüğünü kontrol edin: Bazı hosting'lerde, cron sistem günlüğünü
/var/log/cronveya/var/log/syslogyolunda görebilirsiniz. SSH erişiminiz varsa, cron job'unuzun sistem tarafından kaydedilip kaydedilmediğini görmek içingrep CRON /var/log/syslogkomutunu çalıştırın.
Gerçek Bir Senaryo: PHP Yolu Sorunu
Bir süre önce ServerNet kullanıcılarından biri, cron job'unun çalışmadığı sorunuyla karşılaştı. Günlük boştu ve betik tarayıcıda sorunsuz çalışıyordu. İnceleme sonucunda, kontrol panelinde yazdığı PHP yolunun /usr/bin/php olduğunu, ancak doğru yolun /usr/local/bin/php olduğunu fark ettik. Yolu değiştirince sorun çözüldü. Bu, yoldaki küçük bir farklılığın bile tüm işi bozabileceğini gösteriyor.
Sonuç: Cron Job'u Ciddiye Alın
Hosting kontrol panelinde bir cron job oluşturmak basit bir iştir, ancak gerçekten çalışması ve güvenilir olması için ayrıntılara dikkat etmelisiniz. Zamanlama yapısını doğru girin, PHP dosyasının mutlak yolunu doğru yorumlayıcıyla birleştirin ve her zaman çıktıyı bir günlük dosyasına yönlendirin, böylece bir sorun oluştuğunda hata ayıklama yapabilirsiniz. Bu ipuçlarına uyarak, cron job'unuz web sitesi görevlerini otomatikleştirmek için güçlü ve sorunsuz bir araç haline gelecektir.
Cron job desteği tam olan istikrarlı bir hosting arıyorsanız, Cron Jobs'a tam erişimli cPanel kontrol paneli sunan ServerNet'in Linux Hosting hizmetlerini kullanabilirsiniz. Ancak hosting seçiminden daha önemlisi, bu aracı doğru kullanmayı öğrenmektir; umarız bu makale bu konuda size yardımcı olmuştur.