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
# 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);

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

# 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");
	}
}

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: , , , ,

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.