Crontab Kütüphanesi


    × Bunları biliyor muydunuz?
"Ajax işleminde 'url' parametresi doğru yol bilgisi için URL::site('controller/method') biçiminde ifade edilmelidir. "


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.

Dosya: Config/Services.php
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


Crontab::command(string $command) : int
Crontab::controller(string $controller) : int
Crontab::wget(string $url) : int
Crontab::script(string $command) : int
Crontab::stringQuery() : string
Crontab::list() : string
Crontab::listarray() : array
Crontab::remove(scalar $id) : bool
Crontab::limit(int $limit = 1) : void
Crontab::queue(callable $callable, int $increment = 1) : void
Crontab::path(string $path) : this
Crontab::interval(string $interval) : this

 

 

# 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ı


+---------------- ->minute()
|  +------------- ->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');
6.46.3 Güncellemesi

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');
30 10 * * 1 /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());
30 10 * * 1 /usr/bin/sh /home/lucky/myfile.sh

 

 

 

# 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();
Paket[6.1.1] Güncellemesi

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.

Paket[6.1.3.6][2021-01-23] Güncellemesi

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ı

Komut Dosyası: Commands/CreateFileCommand.php
<?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.

Paket[6.1.3.6][2021-01-23] Güncellemesi

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ı

Komut Dosyası: Commands/Example.php
<?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.

Son Değeri Yakalama

Kuyruğun kaldığı son değer. 2. parametreye yazılan function($queIndex){...} fonskiyonunun 1. parametresine atanacak değişken ile yakalanır.

Artış Miktarını Yakalama

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ırma

Görevi sonlandırmak için fonksiyonun false ile return edilmesi gerekmektedir.

E-posta Gönderim Örneği

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.