Projelerim

AirCron

Tıkla, Github Deposuna Ulaş

AirCron Nedir ?

Apache web sunucunuzda zaman ayarlı görevlerin kolayca atanmasını sağlayan PHP ile geliştirdiğim hafif ve güvenli bir sistemdir.Normalde Apache sunucularında zamanlanmış görevlerin çalıştırılmasında CronJob kullanılsa da; hem sistem kaynaklarını fazla kullanması hem CronJob ile detaylı işlemlerin çalıştırılamaması hem de CPanel gibi yönetim panellerine erişimi olmayan sunucu yöneticilerinin bu zamanlı görevleri ayarlayamaması gibi problemlere çözüm olması amacıyla CronJob’ a alternatif olarak AirCron geliştirilmiştir.

AirCron’un kullanılabilmesi için herhangi bir yönetim paneli, veri tabanı ya da CronJob erişimine ihtiyaç yoktur.Yalnızca FTP erişimi yeterli olacaktır.

Çalışma prensibi olarak kullanıcıların sunucuya gönderdiği isteklerle  zamanlanmış görevleri denetler. Yani bir kullanıcı web sitenize girip sayfaların arasında gezindiğinde aynı zamanda AirCron’ u  da arka planda çalıştırmış olur. AirCron bu esnada tüm görevleri yoklar ve o anda bir görev çalıştırması gerekiyor ise çalıştırır. Bu nedenle web sitenizin sayfaları , görevlerinizin çalıştırılması gerektiği zaman aralığında bir kullanıcı tarafından ziyaret edilmezse AirCron gecikmeli olarak çalışacaktır. Ancak AirCron’ un Clock & Multiple denetimi ile bu sorun tolare edilebilmektedir. Yazının devamında Clock & Multiple denetiminden detaylıca bahsedilecektir

AirCron Temel olarak iki fazda görev gerçekleştirebilir

  1. Interval Type Operating (Aralık Tipi Çalıştırma) : Belirlediğiniz aralık diliminde (Örneğin Saat başı, 10 dakikada bir vb.), istediğiniz görevleri yerine getiren PHP dosyalarını çalıştırır.
  2. Date Type Operating (Tarih Tipi Çalıştırma): Sunucunuzun tarih – saati, önceden belirlediğiniz AiCron görevinin tarih-saatine ulaştığında istediğiniz görevleri yerine getiren PHP dosyalarını çalıştırır. Bu görevler çalıştırıldıktan sonra sistemden silinmektedir.

AirCron Kullanmak İçin 7 Neden

  1. Belirli bir tarih için tek seferlik çalıştırılmak üzere görev eklenebilmektedir.
  2. Normal CronJob’ dan farklı olarak çalıştırılan görevlere “SESSION”, “COOKIE” ve “CLOCK” verileri eklenebilmektedir. Bu nedenle sadece genel değil, kullanıcı bazında da işlemlerin de gerçekleştirilebilmesi mümkün olmaktadır.
  3. Görevlere çalıştırmak üzere eklenen .PHP sayfalarına GET ve POST metodları ile veri gönderilebilmektedir.Eğer görevde veri gönderilmesi gerekli değilse”INVOKE” metodu ile -daha hafif olarak- sadece görevlendirilmiş PHP dosyasını çalıştırılabilir.
  4. Multiple Denetimi : Interval Type Operating görevlerinde eğer çalışma aralığı aşılmışsa , multiple özelliği ile gecikme süresinin çalışma aralığına oranınca görev tekrar tekrar çalıştırılabilir. (Örneğin dakikada bir tekrar edilmesi gereken bir görev, 20 dakika boyunca aircron tetiklenmediğinde 20 defa zamanında çalıştırılmamış olacaktır. Ancak AirCron’un ilk tetiklenmesinde  görev otomatik olarak ard arda 20 defa çalıştırılır.)
  5. Clock Değişkeni: görevlerde çalışma aralığı aşılmışsa , Clock değişkeni ile görevin çalıştırılmasının ne kadar geciktiği, çalıştırılacak göreve veri olarak gönderilebilir. (Örneğin dakikada bir tekrar edilmesi gereken bir görev, 10 dakika boyunca AirCron tetiklenmediğinde 10 defa zamanında çalışmamış olacaktır. Ancak AirCron’un ilk tetiklenmesinde çalıştırılan  bu göreve  toplam gecikme süresi de parametre olarak eklenebilmektedir.)
  6. AirCron , web sitenizin sayfalarını ziyaret eden kullanıcılar tarafından tetiklenir.Bu tetikleme sistemi javascript ile web sitenizin tüm sayfalarına kolayca implemente edilebilir. Tetikleme sistemi aynı zamanda görevlerin daha az sistem kullanımı ile kontrol edilebilmesine de olanak sağlar.
  7. Kurulumu , ayarlaması ve kontrolü daha kolaydır.

AirCron Kurulumu

 

1-AirCron klasörünü bir FTP yazılımıyla sunucuya yükleyin

2-Trigger.js dosyasının içeriğini kopyalayın ve AirCron’un çalıştırılacağı sayfaların sonuna ekleyin. Bu javascript betiğindeki php linkini kendi AirCron klasörünüzün konumuna göre düzenlemeyi unutmayın.

3-Kurulum aşamasını tamamladık. Zamanlı görev yönetimi Cron_base.txt dosyası üzerinden yapılacaktır.

Önemli Not: Cron.php dosyasına okuma, yazma ve çalıştırma izinlerini vermeyi unutmayın. Bu izinleri, Cron.php‘ nin chmod özelliğini “777” olarak değiştirerek verebilirsiniz.

Kullanım Kılavuzu

Bütün görev işlemlerini Cron_base.txt dosyasından yapmaktayız. Bu dosya JSON yapısından oluşmakta. Yapının sadece 2.node’ u bizi ilgilendiriyor. İlk node, AirCron tarafından otomatik olarak değiştirildiğinden buraya dokunmuyoruz.

Biz de bir görev Node’u oluşturarak başlayalım
[
  [

  ],
  [
    {

    }
  ]

]

İlk olarak görevin içine  ID numarasını girmeliyiz. Diziler mantığından da aşina olduğumuz üzere ilk Id, 0′ dan başlamakta.

[
  [

  ],
  [
    {
       "id":"0"
    }
  ]

]

Şimdi yalnızca işlem yaptığımız Node’a odaklanalım. ID değerimizin hemen altına, çağıracağımız php dosyasını tam link olarak ekleyelim.

 [
   {
    "id":"0",
    "page":"http://websitem.com/aircron/test.php"
   }
]
Şimdi ise bu PHP sayfasının ne zaman çalıştırılacağını belirleyelim.

Bunun için Interval ya da Date ekleyebiliriz. Eğer bir Interval değeri olarak 20 eklersek, bu işlemin 20 saniyede bir düzenli olarak çalıştırılacağı anlamına gelir. Eğer bir Date değeri olarak da tarih eklersek bu, işlemin belirlenen tarihte sadece 1 defa çalıştırılacağı anlamına gelir. Interval eklenerek belirli bir sürede yinelenen görevleri Interval Type Operating, date eklenerek ise belirli bir zamanda sadece bir defa çalışan görevleri ise Date Type Operating olarak adlandırıyoruz.

(Interval Eklenmiş örnek) 20 saniyede bir düzenli olarak çalışcaktır

[  
 {  
   "id":"0",  
   "page":"http://websitem.com/aircron/test.php",
   "interval":"20"
 } 
]

(Date eklenmiş örnek) Tarih değeri

Gün.Ay.Yıl[Space]Saat:Dakika:Saniye

formatında eklenmelidir.  Aşağıdaki örnekte görev, 10 ağustos 2018′ de, saat 08:30′ da çalışmak üzere kurulmuştur.

[  
  {  
    "id":"0",
    "page":"http://websitem.com/aircron/test.php",
    "date":"10.08.18 08:30:0"
  } 
]
Sırada ise metodumuzu belirlemek var.

Zaman ayarlı görevimizin çalıştırdığı PHP sayfasına veri göndermek istiyorsak POST veya GET metodlarını tercih etmeliyiz. Eğer sadece sayfa çalıştırılsın istiyorsak ise INVOKE metodunu tercih etmeliyiz

(Eğer veri gönderecek isek kırmızı alanda INVOKE yerine POST ya da GET yazabilirsiniz. Hangi metod kullanacağınıza göre seçin.)

[  
  {  
     "id":"0",
     "page":"http://websitem.com/aircron/test.php",
     "date":"10.08.18 08:30:0",
     "request":"INVOKE",
  } 
]

Şimdi ise görev çalıştığında PHP sayfasına gönderilecek dinamik verileri belirleyeceğiz. Görev Node’ umuza data parametresini de eklemenin zamanı geldi.

"data":"ses(username)"

Yukarıdaki kırmızı yer, username adındaki SESSION değerini PHP dosyamıza gönderecektir.

"data":"ses(username),cook(country)"

Şimdi ise session ile beraber country adındaki COOKIE verisini de PHP dosyamıza gönderebiliyoruz. Aralarına , koyarak birden fazla veri gönderebilirsiniz. Bu veriler PHP dosyanıza

$_POST[“POST0”] = $_SESSION[“username”]

$_POST[“POST1”] = $_COOKIE[“country”]

olarak gönderilecektir.Eğer GET metodu kullanıysanız da $_GET[“GET0”]  $_GET[“GET1”] olarak gönderilir.

Bunlara ek olarak bir de Clock verisini göndermek üzere görevlere ekleyebiliyoruz.

Clock verisi, görevin çalışma zamanına bağlı olarak değişen bir değişkendir. Döndürdüğü değerler, görevin ITO ya da DTO olmasına göre farklılık gösterir.

"data":"Clock(runtime:dmy_smh)"

Görenin çalışma saati-tarihini           Gün.Ay.Yıl  Saat:Dakika:Saniye olarak döndürür

"data":"Clock(runtime:digit)"

Görevin çalışma saati-tarihini sayı cinsinden döndürür. Örneğin : 588944732 sayısı, bir saat ve tarihi gösterir

"data":"Clock(latency:dmy_smh)"

Görevin çalışmasının gecikmesini Gün.Ay.Yıl Saniye:Dakika:Saat olarak döndürür. Örneğin: görevin çalışması 60 saat gecikmişse 2.0.0 0:0:12 olarak döndürür

"data":"Clock(latency:digit)"

Görevin çalışmasının gecikmesini saniye cinsinden döndürür. Örneğin görevin çalışması 10 dakika gecikmişse 600 döndürür.

Artık bilinmesi gereken tek şey, multiple kavramı. Onu da aşağıdaki konsept kullanım örneğini inceleyerek daha iyi kavrayacağınızı düşündüğümden buraya eklemedim.

Konsept Kullanım Örneği

AirCron’un kullanımının bir konsept üzerinden anlatılmasının, geliştiricilere anlaşılabilirlik açısından kolaylık sağlayacağını düşünüyorum. Konseptimiz üzerinden gerçekleştireceğimiz tüm somut uyarlamalar, AirCron’un kullanım alanının kavranması ve kullanımının da kolaylaşması açısından daha iyi deneyim sunacaktır.

Konseptimiz bir tarayıcı oyunu olsun.Aslında hepimizin bir dönem oynamış olacağı meşhur  “Farmville” üzerinden AirCron’u deneyimleyeceğiz.

 

Diyelim ki kullanıcıların bir ana binası olsun. Bu ana bina her 10 dakikada bir, 1 altın versin.

Normalde bu işlevi CronJob ile yapmak isteseydik  tüm kullanıcılara 1 altın veren bir PHP dosyası yazmamız ve bunu 10 dakikada bir çalışmak üzere CronJob’a eklememiz gerekirdi. Bu da bir anda milyonlarca oyuncunun her birine 1 altın verilmesi demektir ki sunucunun zorlanması, hatta bağlantı kopmaları yaşanması olasıdır.

Bu probleme AirCron ile çözüm bulmak gerekirse

1-Cron_base.txt dosyamıza 10 dakikada bir çalışacak bir Interval Type Operating görevi eklerdik.
{
"id":"1",
"page":"http://farmville.com/10dakikada1altin.php",
"interval":"600"
},

Intervali 600 saniye ayarlayarak 10 dakikada bir çalışacak “10dakikada1altin” dosyasını belirttik.

2-Kullanıcıya 1 altın verecek olan PHP dosyamıza , işlemi sadece o kullanıcı için yapması ve sistemde yoğunluk yapmaması için SESSION verisini göndererek işlemi özelleştirirdik.
{
"id":"1",
"page":"http://farmville.com/10dakikada1altin.php",
"interval":"600",
"request":"POST",
"data":"ses(user_id)"

},

request parametresi ile altın verecek olan PHP dosyamıza verilerin gönderim metodunu belirliyoruz.

ses(user_id) ile de , yalnızca aircron’u tetikleyen kullanıcıya 10 dakikalık bekleme süresi sonucu altınını vermek için SESSION verisini ekliyoruz.

Bu veriyi alan “10dakikada1altin.php” php dosyası, yalnızca bu $_SESSION[‘user_id’] için işlem yapabilecek.

3-Güzel ama ya kullanıcı 50 dakika sonra sisteme girerse ne olacak ? 5 altına nasıl kavuşacak ?

İşte burada CLOCK verisi devreye giriyor. SESSION verisine ek olarak CLOCK verisini de göndermeliyiz ve gidebileceğimiz 3 ayrı yol var.

  • A)
{ 
"id":"1", 
"page":"http://farmville.com/10dakikada1altin.php", 
"interval":"600", 
"request":"POST", 
"data":"ses(user_id,clock(latency:count))" 
},

İsterseniz, clock(latency:count) ile, sayfanın kaç defa çalışması gerektiğini gönderebilirsiniz. Kullanıcı altınını 10 dakikada bir alacaksa ve 50 dakikadır girmediyse, bu değer PHP dosyanıza 5 olarak gönderilecektir. 

  • B)
{ 
"id":"1", 
"page":"http://farmville.com/10dakikada1altin.php", 
"interval":"600", 
"request":"POST", 
"data":"ses(user_id,clock(latency:digit))" 
},

İsterseniz, clock(latency:digit) ile, işlevin çalışmasının kaç saniye geciktiğini PHP dosyanıza gönderebilirsiniz. Kullanıcı 50 dakikadır sisteme girmeyerek altın almadıysa PHP dosyanıza 70 * 50 = 3500 saniye gecikme olarak gönderilir. Siz de bu veriyi kullanacak biçimde “10dakikada1altin.php” sayfasındaki algoritmanızı güncelleyerek hesap yapabilir ve kullanıcınıza gerektiği kadar altını verebilirsiniz.

  • C)
{ 
"id":"1", 
"page":
"http://farmville.com/10dakikada1altin.php", 
"interval":"600", "request":"POST", 
"multiple":"false",
"data":"ses(user_id)" 
},

İsterseniz; clock verilerini hiç karıştırmayarak, yalnızca multiple özelliğini true yaparak sorunu çözebilirsiniz. Bu da gecikme sayısı kadar PHP dosyasının yenilenmesi anlamına gelir. Yani kullanıcı 50 dakikadır sisteme girmeyerek altın almadıysa  , PHP dosyası 5 defa otomatik olarak AirCron tarafından çalıştırılır. 

Tabii multiple denetiminin bu şekilde kullanılması, güvenlik zaafiyetine sebep olacağından tavsiye edilmez (Güvenlik zaafiyeti yalnızca bu örnek içindir. Çünkü kullanıcı “10dakikada1altin.php” dosyasını farkedip sürekli bu sayfaya girerse kendine istediği kadar altın verebilir.Zira bu sayfaya algoritma olarak da bir de yenileme kontrolü eklemeniz gerekebilir.)

Daha Fazla Kişiye Ulaşması İçin Bu İçeriği Paylaşabilirsiniz :

1 Comment

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir