Mencegah cronjob terpanggil dobel – dobel

Pada kesempatan kali ini saya tidak membahas apa itu cronjob secara menyeluruh, karena sudah banyak sekali penjelasan tenang cronjob, tinggal search saja “cronjob adalah” maka sudah banyak artikel yang menjelaskan apa itu cronjob dan bagaimana cara mengaturnya.

Namun saya akan menyinggung secara singkat saja, cronjob merupakan salah satu fitur dari cPanel yang cukup penting, cronjob berguna untuk menjalankan script pada waktu sesuai jadwal yang kita atur sehingga akan sangat membantu programer untuk menjalankan fungsi tertentu.

Dibalik fungsinya tersebut, cronjob juga memiliki kelemahan menurut saya, dimana skrip yang kita panggil via cronjob bisa dipanggil bertumpuk – tumpuk. Misalnya kita mengatur cronjob yang memanggil skrip a.php dan dipanggil setiap menit, skrip a.php tersebut kadang-kadang memerlukan waktu lebih dari satu menit untuk menyelesaikan prosesnya, karena banyak query dan aksi yang dipanggil misalnya, ketika a.php belum selesai diproses dan sudah ada panggilan cronjob a.php berikutnya maka yang terjadi adalah proses akan menumpuk, panggilan pertama belum selesai sudah ada panggilan yang kedua, nanti panggilan yang kedua belum selesai sudah ada panggilan yang ketiga dan seterusnya dan seterusnya, lama – lama proses tersebut sangat memberatkan server dan server bisa down gara – gara proses cronjob tersebut.

Masalah tersebutlah yang sama-sama kita akan selesaikan.

Cara yang saya gunakan untuk menanggulangi masalah tersebut adalah dengan cara ketika skrip a.php dipanggil maka ciptakan semacam flag bahwa skrip a.php sedang dipanggil jika belum ada, jika flag sudah ada hentikan. Dan ketika a.php selesai melakukan tugasnya flag dihapus. Sehingga jika cronjob memanggil a.php dan terdapat flag maka tugas cronjob pada jadwal tersebut dianggap selesai, berikut contoh implementasinya:

a.php
[php]
<?php
# nama file untuk flag
$file_flag = "a.log";

# lokasi dimana akan dibuat, pada contoh ini dilokasi file ini berada
$path = __DIR__ . "/";

$path_file = $path . $file_flag;
# jika file sudah ada berarti sedang dijalanakan, jika belum ada lanjut
if (is_file($path_file)) {
die("hentikan");
}

# ciptakan file
touch($path_file);

/**
*
* Disini tempat jalankan fungsi
*/

# hapus flag jika sudah selesai
unlink($path_file);
[/php]

Pada contoh diatas, flag dibuat dengan cara menciptakan file tertentu sebagai tanda saja kalo sedang dijalankan. Flag tidak harus menciptakan file ya, bisa saja pake SESSION, atau dengan query ke record tabel tertentu.

Tanya mas, bagaimana jika terdapat kasus skrip a.php terdapat error saat menjalankan tugasnya dan flag belum sempat dihapus, sehingga panggilan – panggilan berikutnya akan selalu dihentikan?

Pertanyaan yang bagus sekali sodara – sodara, hehehe

Untuk menjawab pertanyaan tersebut bisa dengan cara dicek flag tersebut kapan dibuatnya, jika sudah lebih dari batas waktu yang kita tentukan berarti ada yang tidak beres. Misalnya kita kasih waktu maksimal 1 jam, karena tidak mungkin menjalankan skrip a.php sampai 1 jam lamanya, berikut contoh implementasinya:

Modifikasi bagian skrip a.php
[php]
# jika file sudah ada berarti sedang dijalanakan, jika belum ada lanjut
if (is_file($path_file)) {
$batas_waktu = "+1 hour";
$kapan_dibuat = filemtime($path_file);

# cek apakah tgl modifikasi + 1 hour kurang dari sekarang
if (strtotime($batas_waktu, $kapan_dibuat) < time()) {
unlink($path_file);
} else {
die("hentikan");
}
}
[/php]

Jika teman – teman masih bingung masalah operasi tanggal di PHP bisa baca post saya yang ini http://www.dokumenary.net/2017/09/02/operasi-tanggal-jam-strtotimedatetime-pada-php/.

Saya rasa cukup untuk post kali ini, jika ada yang masih bingung mari kita diskusikan pada komentar ya…

Mohon ikuti blog ini
Jangan lupa like Facebook Page Dokumenary atau masukkan email Anda pada form subscribe bagian sidebar ya, supaya setiap update posting cepat Anda dapatkan.

Terimakasih 🙂

Category: Uncategorized

Tags: , , , ,

Comments

  1. atorvastatin 80mg oral lipitor 40mg over the counter order lipitor pill

    Reply
  2. order baycip for sale – amoxiclav over the counter buy clavulanate for sale

    Reply
  3. purchase ciprofloxacin online cheap – keflex order online buy augmentin pills

    Reply
  4. flagyl 200mg without prescription – terramycin 250 mg pills brand azithromycin 250mg

    Reply
  5. Creati un cont gratuit
    March 17, 2024 - 3:35 pm

    Thanks for sharing. I read many of your blog posts, cool, your blog is very good.

    Reply
  6. purchase ciprofloxacin pills – buy generic amoxicillin online
    erythromycin 500mg sale

    Reply
  7. valtrex medication – buy nateglinide generic purchase acyclovir for sale

    Reply
  8. stromectol 2mg online – amoxiclav cheap buy tetracycline 250mg sale

    Reply
  9. cheap metronidazole 400mg – buy generic oxytetracycline for sale buy azithromycin medication

    Reply
  10. cost acillin penicillin for sale online oral amoxicillin

    Reply
  11. buy lasix online cheap – tacrolimus 5mg oral oral capoten

    Reply
  12. order metformin 500mg online – buy generic lamivudine for sale order lincomycin 500 mg generic

    Reply
  13. buy pill generic zidovudine – buy lamivudine online buy generic allopurinol online

    Reply
  14. where can i buy clozapine – frumil 5 mg brand order famotidine 20mg

    Reply

Leave a Reply

Your email address will not be published / Required fields are marked *