Crontab Kütüphanesi
"Başlangıç dosya ve kontrolcüleri üzerinden tüm kontrolcü ve görünümlere veri gönderilebilir."
Crontab kütüphanesi LINUX işletim sistemlerinde zamanlanmış görevleri yönetmek için oluşturulmuş kütüphanedir. Bu kütüphane sayesinde belirlenen zamanlarda belirlenen işlerin yaptırılmasını sağlayabilirsiniz.
# Gereksinimler
1 - İşletim sisteminin Linux olması gerekmektedir.
2 - Crontab'ın işletim sisteminde kurulu olması gerekmektedir.
# Kurulum
ZN dağıtımları için kurulum gerekmez.
↓ composer require znframework/package-crontab
# Yapılandırma
Aşağıda crontab ayarlarını yapılandırmak için kullanılan dizi gösterilmiştir.
Processor | |||
string $driver = 'exec' | Komut çalıştırmak için kullanılan yöntemi belirtir. | ||
Seçenekler | exec, shell, system, ssh | ||
string $path = '/usr/bin/php' | Çalıştırılıcak PHP'nin yolunu ifade eder. |
# Yöntemler
# Zaman Yöntemleri
Aşağıdaki listede hangi zaman yöntemi ile hangi ayarlamaların yapılabileceği gösterilmiştir.
Yöntem | Parametre | Anlamı | |||
hourly() | Her saatte bir. | ||||
daily() | Her günde bir. | ||||
midnight() | Her gecede bir. | ||||
monthly() | Her ayda bir. | ||||
weekly() | Her haftada bir. | ||||
yearly() | Her yılda bir. | ||||
clock() | 12:30 | 00:48 | 20:00 | Belirtilen saatte bir. | |
minute() | 5 | 5-10 | 53,55,57 | Belirtilen dakikalarda. | |
perminute() | 30 | Her belirtilen dakikada bir. | |||
hour() | 23 | 7-13 | 3,5,11 | Belirtilen saatlerde. | |
perhour() | 2 | Her belirtilen saatte bir. | |||
day() | monday | sunday | saturday | Belirtilen günlerde. | |
perday() | friday | Her belirtilen günlerde bir. | |||
dayNumber() | 30 | 10 | 15 | Her ayın belirli gününde bir. |
# Zaman Formatı
| +------------- ->hour()
| | +---------- ->dayNumber()
| | | +------- ->month()
| | | | +---- ->day()
| | | | |
* * * * * [ ->path() ] [ ->controller() / command() ]
# Konsol ile Kullanım (ZN >= 5.1.0)
Linux sistemlerde terminal kullanarak zamanlanmış görevler oluşturabilirsiniz. Aşağıda bir kontrolcü ve bir command kütüphanesine yönelik kod çalıştırma örneği verilmiştir.
php zerocore run-cron home/sendmail minute /1
php zerocore run-cron ExampleCommand:sendMail daily
php zerocore run-cron http://example.site/example/page
php zerocore cron-list
php zerocore remove-cron 1
# Command
ZN Framework Commands/ dizini içinde yer alan yazdığınız özel komutları çalıştırmak için kullanılır.
Parametreler
string $command | Çalıştırılacak Sınıf ve metot bilgisi. |
return int |
Kullanımı
Crontab::day('monday')->clock('10:30')->command('EmailCommand:send');
Crontab::daily()->command('EmailCommand:send');
Bu güncellemede komut dosyasına parametre gönderebilmek için opsiyonel yöntem olarak Crontab::parameters() yöntemi eklenmiştir.
Parametreler
array ...$parameters | Gönderilecek parametreler. |
return this |
Kullanımı
Crontab::daily()->parameters('exampleFile')->command('File:delete');
Yukarıdaki örnekte içinde 'home' geçen görevler silinir. Zamanlanmış görevleri görmek için Crontab::list() yönteminden yararlanabilirsiniz.
# Controller
ZN Framework kontrolcülerini ve ona bağlı yöntemleri çalıştırılabilmek için kullanılır.
Parametreler
string $controller | Çalıştırılacak Kontrolcü ve metot bilgisi. Bu parametreye controller/function formunda bilgi yazılır. Kontrolcü adı dosya adına göre yazılır. |
return int |
Kullanımı
Crontab::day('monday')->clock('10:30')->controller('Accounts/sendEmail');
Crontab::daily()->controller('Accounts/sendEmail');
# Wget
URL çalıştırmak için kullanılır.
Parametreler
string $url | Çalıştırılacak URL bilgisi. |
return int |
Kullanımı
Crontab::day('monday')->clock('10:30')->wget('http://site.com/example/page');
# Script [6.8.0][2021-05-02]
Zaman damgasından itibaren herhangi bir kod çalıştırmak için kullanılır. Daha önceki yöntemlerin hepsi php çalıştırırken bu yöntem ile istediğiniz betiği çalıştırabilirsiniz.
Parametreler
string $command | Çalıştırılacak komut bilgisi. |
return int |
Kullanımı
Crontab::day('monday')->clock('10:30')->script('/usr/bin/sh /home/lucky/myfile.sh');
# StringQuery [6.9.0][2021-05-03]
Oluşturulan cron komutunun string çıktısını almak için kullanılır.
Parametreler
return string |
Kullanımı
Crontab::day('monday')->clock('10:30')->script('/usr/bin/sh /home/lucky/myfile.sh');
output(Crontab::stringQuery());
# Path
Crontab için çalıştırılacak olan PHP'nin yoludur. Ön tanımlı: /usr/bin/php
Parametreler
string $path | PHP Yolu. |
return this |
Kullanımı
Crontab::month(1)
->day(1)
->clock('12:30')
->path('/opt/lampp/bin/php')
->controller('home/test');
# List
Zamanlanmış görevlerin listesini verir.
Parametreler
return | string |
Kullanımı
echo Crontab::list();
# Listarray
Zamanlanmış görevlerin listesini dizi türünden verir.
Parametreler
return | array |
Kullanımı
echo Crontab::listarray();
# Remove
Zamanlanmış görevi silmek için kullanılır.
Parametreler
scalar $id = NULL | Crontab::list() yöntemi ile listelenen cron işlerin başındaki id değerine göre silme işlemi yapabilirsiniz. |
Kullanımı
Crontab::remove(1);
Tüm zamanlanmış görevleri silmek için;
Crontab::remove();
Bu güncelleme ile bu yöntemin parametresi string türden veri kabul etmektedir. Parametre olarak yazılan ifadenin içinde geçtiği zamanlanmış görevler silinir.
Crontab::remove('home');
Yukarıdaki örnekte içinde 'home' geçen görevler silinir. Zamanlanmış görevleri görmek için Crontab::list() yönteminden yararlanabilirsiniz.
# Limit (ZN >= 5.3.6)
Zamanlanmış görevin kaç kez çalışacağını belirlemek için kullanılır. Bu yöntem komut dosyası içerisinde kullanılır.
Bu güncellemede 1. parametre olan int $id parametresi kaldırılmıştır. Artık bu yöntem çalıştığı komut sınıfını otomatik olarak algılıyor.
Parametreler
int $limit = 1 | Komutun kaç kez çalıştırılacağı. |
Kullanımı
<?php namespace Project\Commands;
use File, Crontab;
class CreateFileCommand extends Command
{
public function do()
{
File::create(md5(rand()));
Crontab::limit(2);
}
}
Aşağıda yukarıdaki komut dosyasını 1 günde bir çalıştıracak konsol komutu yer almaktadır.
php zerocore run-cron CreateFileCommand:do perday 1
Komut 2 kez çalıştıktan sonra zamanlanmış görev sonlandılır.
# Queue
Zamanlanmış görevin belli koşullara göre çalışmaya devam edeceğini veya sonlanacağını belirlemek için kullanılır. Bu yöntem komut dosyası içerisinde kullanılır. Özellikle toplu mail gönderimleri için oldukça kullanışlıdır.
Bu güncellemede 1. parametre olan int $id parametresi kaldırılmıştır. Artık bu yöntem çalıştığı komut sınıfını otomatik olarak algılıyor.
Parametreler
callable $callable | Çalıştırılacak fonksiyon. 2 tane parametresi vardır. $queIndex ve $increment QueueIndex 0'dan başlar ve artış miktarına bağlı olarak kuyruğun kaldığı son indeksi döndürür. |
int $increment = 1 |
Artışın kaçar kaçar olacağı. |
Kullanımı
<?php namespace Project\Commands;
use File, Crontab;
class Example extends Command
{
public function do()
{
Crontab::queue(function($queueIndex, $increment)
{
File::create($queueIndex);
if( $queueIndex === 2 )
{
return false;
}
});
}
}
Aşağıda yukarıdaki komut dosyasını 1 dakikada bir çalıştıracak konsol komutu yer almaktadır.
php zerocore run-cron Example:do perminute 1
Komut çalıştırıldıktan sonra 0, 1 ve 2 isimli 3 adet dosya oluşturacak ve görev tamamlanacaktır.
Kuyruğun kaldığı son değer. 2. parametreye yazılan function($queIndex){...} fonskiyonunun 1. parametresine atanacak değişken ile yakalanır.
Queue() yöntemine yazılan 3. parametreyi yakalamak için 2. parametreye yazılan function($queIndex, $increment){...} fonksiyonunun 2. parametresine atanacak değişken ile yakalanır.
Görevi sonlandırmak için fonksiyonun false ile return edilmesi gerekmektedir.
Aşağıda basit bir şekilde toplu e-posta gönderim örneği verilmiştir.
Komut Dosyası: Commands/SendEmailAllCommand.php<?php namespace Project\Commands; use Email, DB, Crontab; class SendEmailAllCommand extends Command { public function do() { Crontab::queue(function($queueIndex, $increment) { $result = DB::limit($queueIndex, $increment)->accountsResult(); foreach( $result as $row ) { Email::bcc($row->email, $row->name); } return Email::from('SiteCom')->send('Subject', 'Message'); }, 35); } }
Aşağıda yukarıdaki komut dosyasını 1 dakikada bir çalıştıracak konsol komutu yer almaktadır.
php zerocore run-cron SendEmailAllCommand:do perminute 1
Artık komut dosyamız her dakikada bir 35 adet e-posta adresine sırası ile toplu mail gönderir. Email::send() yöntemi false dönene kadar e-posta gönderimlerine devam eder. Hatalı e-posta ihtimallerine karşılık komutun sonraki e-postalar için devam etmesi istenirse $result değişkenide return (bool) count($result); şeklinde döndürülebilir.