Indonesian (Bahasa Indonesia) translation by Hasannudin Amin (you can also view the original English article)
CronTab, atau "Cron Table", adalah proses sistem Linux / daemon yang memfasilitasi penjadwalan tugas yang berulang sehingga memudahkan kita
Dalam tutorial ini, kita akan membuat class PHP yang dinamis, dengan menggunakan koneksi yang aman, memberi kita sarana untuk memanipulasi cronTab!
Latar belakang - Sekilas tentang Crontab
Mari kita hadapi itu, memiliki kemampuan untuk menjadwalkan tugas untuk berjalan di latar belakang adalah sesuatu yang hebat! Dari mencadangkan database SQL, mengambil / mengirim email untuk menjalankan tugas pembersihan, menganalisis kinerja, atau bahkan mengambil umpan RSS, cron jobs sangat fantastis!
Meskipun sintaks penjadwalan job baru mungkin tampak menakutkan pada pandangan pertama, namun sebenarnya cukup mudah dipahami begitu Anda memecahnya. Cron job akan selalu memiliki lima kolom yang masing-masing mewakili 'operator' kronologis diikuti oleh jalur dan perintah lengkap untuk mengeksekusi:
1 |
* * * * * home/path/to/command/the_command.sh |
Masing-masing kolom kronologis memiliki relevansi khusus dengan jadwal tugas. Penjelasan sebagai berikut:
- Minutes mewakili menit satu jam, bisa di isi 0-59.
- Hours mewakili jam pada hari tertentu, bisa di isi 0-23.
- Days mewakili hari-hari dalam satu bulan tertentu, bisa di isi 1-31.
- Months mewakili bulan tahun tertentu, bisa di isi 1-12.
- Day of the Week mewakili hari dalam seminggu, Minggu sampai Sabtu, secara numerik, bisa di isi 0-6.
1 |
Minutes [0-59] |
2 |
| Hours [0-23] |
3 |
| | Days [1-31] |
4 |
| | | Months [1-12] |
5 |
| | | | Days of the Week [Numeric, 0-6] |
6 |
| | | | | |
7 |
* * * * * home/path/to/command/the_command.sh |
Jadi, misalnya, jika seseorang ingin menjadwalkan tugas untuk 12:00 pada hari pertama setiap bulan akan terlihat seperti ini:
1 |
0 0 1 * * home/path/to/command/the_command.sh |
Jika kita ingin menjadwalkan tugas untuk dijalankan setiap hari Sabtu pukul 8:30 pagi hari, kita akan menuliskannya sebagai berikut:
1 |
30 8 * * 6 home/path/to/command/the_command.sh |
Ada juga sejumlah operator yang bisa digunakan untuk menyesuaikan jadwal lebih jauh:
- Koma digunakan untuk membuat daftar nilai koma yang dipisahkan untuk salah satu kolom cron.
- Tanda hubung digunakan untuk menentukan kisaran nilai.
- Tanda bintang digunakan untuk menentukan nilai 'all' atau 'every'
CronTab, secara default, akan mengirim email pemberitahuan setiap kali tugas terjadwal dijalankan.
CronTab, secara default, akan mengirim email pemberitahuan setiap kali tugas terjadwal dijalankan. Namun, dalam banyak situasi, ini tidak diperlukan. Kita dapat dengan mudah menekan fungsi ini, meskipun, dengan mengarahkan output standar dari perintah ini ke perangkat 'black hole' atau /dev/null. Intinya, ini adalah file yang akan membuang semua yang tertulis padanya. Pengalihan output dilakukan melalui operator >. Mari kita lihat bagaimana kita bisa mengarahkan output standar ke black hole dengan menggunakan contoh cron job kita yang menjalankan tugas
yang dijadwalkan setiap hari Sabtu pukul 8:30 pagi:
1 |
30 8 * * 6 home/path/to/command/the_command.sh >/dev/null |
Selain itu, jika kita mengalihkan output standar ke perangkat null, mungkin kita juga ingin mengalihkan kesalahan standar juga. Kita bisa melakukan ini dengan hanya mengarahkan kesalahan standar ke tempat keluaran standar sudah dialihkan, perangkat null!
1 |
30 8 * * 6 home/path/to/command/the_command.sh >/dev/null 2>&1 |
Langkah 1 - Blueprint
Untuk mengelola cronTab dengan PHP, kita memerlukan kemampuan untuk menjalankan perintah, di remote server, sebagai pengguna cronTab yang kita sunting. Untungnya, PHP memberi kita cara sederhana untuk melakukannya melalui library SSH2. Anda mungkin sudah atau belum menginstal library ini jadi jika belum, Anda pasti ingin menginstalnya terlebih dahulu:
Instalasi / Konfigurasi PHP libssh2
Kita akan memulai kelas kita dengan menyatakan empat properti, yang semuanya akan bersifat pribadi:
- $connection merepresentasikan koneksi / resource kita.
- $path akan mewakili path untuk file tersebut.
- $handle akan mewakili nama file cron sementara kita.
- $cron_file mewakili path lengkap dan nama file cron sementara.
Class kita harus dapat terhubung dan mengotentikasi, sebagai pengguna yang sesuai, untuk menjalankan perintah dan memiliki akses cronTab pengguna tersebut. Dengan demikian, kita akan membuat sambungan SSH2 dan mengotentikasi dalam konstruktor itu sendiri.
Dengan koneksi yang dikonfirmasi di tempat, kita kemudian akan memerlukan metode untuk menangani pelaksanaan perintah berbagai kami akan berjalan. Kami akan nama exec() metode ini. Umumnya, kami akan memanggil metode ini dari dalam metode lain kelas kita saat kita perlu untuk mengeksekusi perintah di server jauh.
Selanjutnya, kita akan memerlukan kemampuan untuk menulis cronTab ke file sehingga kita memiliki akses yang nyata untuk itu. Kita juga memerlukan cara untuk menghapus file ini ketika kita selesai dengannya. Mari kita mendefinisikan metode yang menangani output cronTab untuk file sebagai write_to_file() dan metode untuk menghapus file ini sebagai remove_file().
Tentu saja, kita juga memerlukan cara untuk membuat dan menghapus cron job. Jadi kita akan mendefinisikan metode append_cronjob() dan remove_cronjob(), masing-masing.
Dalam kasus ketika kita telah menghapus hanya / cronjob terakhir kita ingin kemampuan untuk menghapus seluruh cronTab daripada mencoba untuk membuat cronTab kosong. Kita akan menggunakan metode remove_crontab() untuk menangani hal ini.
Akhirnya, kita akan menciptakan dua metode penolong untuk class kita. Yang pertama dari metode ini, yang akan mengembalikan nilai boolean, hanya akan memeriksa keberadaan file cron sementara. Yang terakhir akan digunakan untuk menampilkan pesan kesalahan ketika terjadi kesalahan. Kita akan menamai metode ini crontab_file_exists() dan error_message(), secara berurutan.
1 |
<?php
|
2 |
|
3 |
Class Ssh2_crontab_manager { |
4 |
|
5 |
private $connection; |
6 |
private $path; |
7 |
private $handle; |
8 |
private $cron_file; |
9 |
|
10 |
function __construct() {...} |
11 |
|
12 |
public function exec() {...} |
13 |
|
14 |
public function write_to_file() {...} |
15 |
|
16 |
public function remove_file() {...} |
17 |
|
18 |
public function append_cronjob() {...} |
19 |
|
20 |
public function remove_cronjob() {...} |
21 |
|
22 |
public function remove_crontab() {...} |
23 |
|
24 |
private function crontab_file_exists() {...} |
25 |
|
26 |
private function error_message() {...} |
27 |
|
28 |
}
|
Langkah 2 - Konstruktor!
Class konstruktor akan bertanggung jawab untuk menetapkan dan otentikasi Sambungan SSH2. Itu akan mengambil empat argumen, yang masing-masing akan memiliki nilai default NULL:
- $host: mewakili alamat ip dari remote server yang kita ingin terhubung dengannya.
- $port: adalah port yang digunakan untuk sambungan SSH2.
- $username: akan mewakili nama pengguana untuk login server.
- $password: mewakili password pengguna untuk server.
1 |
function __construct($host=NULL, $port=NULL, $username=NULL, $password=NULL) {...} |
Dalam konstruktor itu sendiri, tempat pertama yang akan kita definisikan adalah $this -> path yang akan mewakili 'default directory' untuk file sementara cron kita.
Idealnya, kita hanya akan menggunakan PHP magic constant __DIR__ untuk mendefinisikan properti ini sebagai direktori kerja saat ini. Namun, ada kesempatan dimana konstan ini tidak dapat ditetapkan. Dengan demikian, kita akan memeriksa untuk melihat jika __DIR__ didefinisikan.
Jika tidak, kita harus mendapatkan direktori kerja saat ini secara manual. Kita akan melakukannya dengan menggunakan kombinasi dari strrpos() dan substr() fungsi dalam hubungannya dengan konstan __FILE__ yang mewakili path lengkap dan nama file saat ini.
Kita akan menggunakan strrpos(), yang mengembalikan posisi terakhir terjadinya substring, menemukan posisi slash terakhir dalam string __FILE__. Nilai ini, yang akan kita simpan sebagai var $path_length, akan memberi kita jumlah karakter hingga namun tidak termasuk garis miring terakhir.
Fungsi substr() akan menyortit 'splice' string yang mengembalikan sebagian string tertentu berdasarkan posisi mulai string dan jumlah karakter yang kita ingin kembalikan.
Kita akan melewati tiga argumen ke fungsi substr()
- string yang kita sedang bekerja dengannya
- lokasi mulainya splice, dalam hal ini
0 - lokasi akhir splice yang diwakili oleh variabel
$path_length.
Kita kemudian akan menggabungkan garis miring ke akhir string ini yang akan memberi kita lokasi direktori kerja saat ini.
1 |
function __construct($host=NULL, $port=NULL, $username=NULL, $password=NULL) |
2 |
{
|
3 |
$path_length = strrpos(__FILE__, "/"); |
4 |
$this->path = substr(__FILE__, 0, $path_length) . '/'; |
5 |
}
|
Sekarang, kita akan menentukan nama file default untuk file cron
sementara sebagai $this->handle dan kemudian menggabungkan path dan menangani propperti bersama sebagai $this->cron_file. Properti ini akan mewakili path penuh default dan nama file untuk file cron sementara.
1 |
function __construct($host=NULL, $port=NULL, $username=NULL, $password=NULL) |
2 |
{
|
3 |
$path_length = strrpos(__FILE__, "/"); |
4 |
$this->path = substr(__FILE__, 0, $path_length) . '/'; |
5 |
$this->handle = 'crontab.txt'; |
6 |
$this->cron_file = "{$this->path}{$this->handle}"; |
7 |
}
|
Dengan properti ini didefinisikan, sekarang kita akan berupaya membuat koneksi ke server dan mengautentikasinya. Kita akan menambahkan beberapa penanganan kesalahan dasar ke class kita untuk membungkus kode berikut di blok try / catch. Dengan cara ini, kita dapat menangkap kesalahan dan membuang pengecualian sehingga memberi umpan balik yang sangat spesifik kepada pengguna.
Di dalam blok try, pertama-tama kita akan memeriksa untuk
memastikan bahwa semua argumen telah didefinisikan dengan menggunakan fungsi is_null() yang akan kembali dengan nilai true atau false. Jika salah satu dari argumen ini adalah NULL, kita akan mengajukan pengecualian baru dengan pesan yang sesuai.
1 |
function __construct($host=NULL, $port=NULL, $username=NULL, $password=NULL) |
2 |
{
|
3 |
$path_length = strrpos(__FILE__, "/"); |
4 |
$this->path = substr(__FILE__, 0, $path_length) . '/'; |
5 |
$this->handle = 'crontab.txt'; |
6 |
$this->cron_file = "{$this->path}{$this->handle}"; |
7 |
|
8 |
try
|
9 |
{
|
10 |
if (is_null($host) || is_null($port) || is_null($username) || is_null($password)) throw new Exception("Please specify the host, port, username and password!"); |
11 |
}
|
12 |
catch
|
13 |
{
|
14 |
|
15 |
}
|
16 |
}
|
Selanjutnya, kita akan mendefinisikan $this->connection dengan melewati $host dan $port argumen ke fungsi ssh2_connect() yang akan membuat koneksi remote dan mengembalikan resource atau FALSE bahwa jika koneksi gagal.
Karena kita menggunakan penanganan kesalahan kita sendiri, kita juga akan menggunakan operator kontrol @ yang akan menekan setiap pesan error untuk fungsi ini. Jika koneksi tidak berhasil, kita akan membuang pengecualian baru dengan pesan yang sesuai.
1 |
function __construct($host=NULL, $port=NULL, $username=NULL, $password=NULL) |
2 |
{
|
3 |
$path_length = strrpos(__FILE__, "/"); |
4 |
$this->path = substr(__FILE__, 0, $path_length) . '/'; |
5 |
$this->handle = 'crontab.txt'; |
6 |
$this->cron_file = "{$this->path}{$this->handle}"; |
7 |
|
8 |
try
|
9 |
{
|
10 |
if (is_null($host) || is_null($port) || is_null($username) || is_null($password)) throw new Exception("Please specify the host, port, username and password!"); |
11 |
|
12 |
$this->connection = @ssh2_connect($host, $port); |
13 |
if ( ! $this->connection) throw new Exception("The SSH2 connection could not be established."); |
14 |
}
|
15 |
catch
|
16 |
{
|
17 |
|
18 |
}
|
19 |
}
|
Kami sekarang akan berusaha untuk mengotentikasi / login menggunakan fungsi ssh2_auth_password() lewat sumber daya kembali dari koneksi kita serta nama pengguna dan kata kunci pengguna yang kita masuki. ssh2_auth_password() akan mengembalikan boolean yang mewakili status otentikasi yang dengannya kita dapat membuang pengecualian baru jika autentikasi gagal.
1 |
function __construct($host=NULL, $port=NULL, $username=NULL, $password=NULL) |
2 |
{
|
3 |
$path_length = strrpos(__FILE__, "/"); |
4 |
$this->path = substr(__FILE__, 0, $path_length) . '/'; |
5 |
$this->handle = 'crontab.txt'; |
6 |
$this->cron_file = "{$this->path}{$this->handle}"; |
7 |
|
8 |
try
|
9 |
{
|
10 |
if (is_null($host) || is_null($port) || is_null($username) || is_null($password)) throw new Exception("Please specify the host, port, username and password!"); |
11 |
|
12 |
$this->connection = @ssh2_connect($host, $port); |
13 |
if ( ! $this->connection) throw new Exception("The SSH2 connection could not be established."); |
14 |
|
15 |
$authentication = @ssh2_auth_password($this->connection, $username, $password); |
16 |
if ( ! $authentication) throw new Exception("Could not authenticate '{$username}' using password: '{$password}'."); |
17 |
}
|
18 |
catch
|
19 |
{
|
20 |
|
21 |
}
|
22 |
}
|
PHP akan mencoba menemukan blok catch yang sesuai, untuk setiap pengecualian yang dilempar, dan kemudian membuat / melewatkan objek pengecualian, yang berisi sejumlah properti bermanfaat, ke blok ini.
Jadi, di blok catch, kita akan menggunakan metode getMessage() objek pengecualian untuk mengakses dan menampilkan pesan yang didefinisikan dalam pengecualian.
Anda akan melihat bahwa kita akan menampilkan pesan dengan menghubungi metode error_message() di class kita. Meskipun metode ini belum didefinisikan, ia hanya akan menampilkan pesan kesalahan dengan cara yang rapi.
1 |
function __construct($host=NULL, $port=NULL, $username=NULL, $password=NULL) |
2 |
{
|
3 |
$path_length = strrpos(__FILE__, "/"); |
4 |
$this->path = substr(__FILE__, 0, $path_length) . '/'; |
5 |
$this->handle = 'crontab.txt'; |
6 |
$this->cron_file = "{$this->path}{$this->handle}"; |
7 |
|
8 |
try
|
9 |
{
|
10 |
if (is_null($host) || is_null($port) || is_null($username) || is_null($password)) throw new Exception("Please specify the host, port, username and password!"); |
11 |
|
12 |
$this->connection = @ssh2_connect($host, $port); |
13 |
if ( ! $this->connection) throw new Exception("The SSH2 connection could not be established."); |
14 |
|
15 |
$authentication = @ssh2_auth_password($this->connection, $username, $password); |
16 |
if ( ! $authentication) throw new Exception("Could not authenticate '{$username}' using password: '{$password}'."); |
17 |
}
|
18 |
catch (Exception $e) |
19 |
{
|
20 |
$this->error_message($e->getMessage()); |
21 |
}
|
22 |
}
|
Langkah 3 - Mengeksekusi Beberapa Perintah
Metode ini akan bertanggung jawab untuk mengeksekusi perintah pada remote server. Ini sebanding dengan memasukkan perintah secara manual ke dalam shell seperti, katakanlah, PuTTY. Untuk memungkinkan fleksibilitas yang lebih besar, kita akan membuat metode ini menjadi umum sehingga pengguna dapat benar-benar mengeksekusi perintah lain yang mungkin perlu dijalankan. Kami juga akan mengizinkan sejumlah argumen setidaknya satu argumen ditentukan. Argumen ini akan mewakili perintah yang ingin kita jalankan menggunakan fungsi ssh2_exec().
Jadi, hal pertama yang akan kita lakukan dalam metode ini adalah
mendefinisikan sebuah variabel yang mewakili jumlah dari jumlah argumen
yang dilewati. Kita akan menggunakan fungsi PHP func_num_args() untuk mendapatkan jumlah ini.
1 |
public function exec() |
2 |
{
|
3 |
$argument_count = func_num_args(); |
4 |
}
|
Sekarang, di dalam blok try, kita akan memeriksa apakah ada argumen atau tidak ada argumen yang kita sampaikan pada metode ini. Jika argumen catch adalah 0, kita akan membuat perkecualian baru dengan pesan yang tepat.
1 |
public function exec() |
2 |
{
|
3 |
$argument_count = func_num_args(); |
4 |
|
5 |
try
|
6 |
{
|
7 |
if ( ! $argument_count) throw new Exception("There is nothing to execute, no arguments specified."); |
8 |
}
|
9 |
catch
|
10 |
{
|
11 |
|
12 |
}
|
13 |
}
|
Selanjutnya, dengan menggunakan fungsi func_get_args(), kita akan membuat sebuah array dari semua argumen yang diteruskan ke metode ini.
Dengan menggunakan operator terner, kita kemudian akan menentukan variabel baru, $command_string, sebagai representasi string dari baris perintah Linux yang sebenarnya yang akan kita jalankan.
Jika kita memiliki beberapa perintah untuk dijalankan, kita akan
menggunakan fungsi PHP implode() untuk mengurai argumen array menjadi sebuah string. Kita akan melewati dua argumen untuk implode(), glue, atau separator, yang pada dasarnya hanyalah sebuah string yang akan disisipkan di antara elemen array, dan array itu sendiri. Kita akan memisahkan setiap elemen dengan operator Linux, && yang memungkinkan kita melakukan beberapa perintah, secara berurutan, dalam
satu baris!
Sebaliknya, jika hanya ada satu perintah, kita akan menentukan string perintah sebagai $arguments[0] yang mewakili argumen / perintah pertama dan satu-satunya.
1 |
public function exec() |
2 |
{
|
3 |
$argument_count = func_num_args(); |
4 |
|
5 |
try
|
6 |
{
|
7 |
if ( ! $argument_count) throw new Exception("There is nothing to execute, no arguments specified."); |
8 |
|
9 |
$arguments = func_get_args(); |
10 |
|
11 |
$command_string = ($argument_count > 1) ? implode(" && ", $arguments) : $arguments[0]; |
12 |
|
13 |
}
|
14 |
catch
|
15 |
{
|
16 |
|
17 |
}
|
18 |
}
|
Dengan perintah kita yang sudah siap dan diurai sebagai string, kita sekarang bisa mencoba mengeksekusi mereka dengan menggunakan fungsi ssh2_exec(). Kita akan melewati connection link id, $this->connection, dan juga $command_string kita untuk fungsi ini yang akan mengembalikan arus success atau false ketika terjadi kegagalan.
Stream didefinisikan sebagai objek sumber daya yang menunjukkan perilaku yang dapat dialirkan ... yang dapat dibaca dari atau ditulis secara linier.
Kita akan menggunakan operator kontrol kesalahan @ di sini, sekali lagi, untuk menekan pesan kesalahan apa pun karena kita akan melemparkan pengecualian kita sendiri, dengan pesan yang sesuai, jika terjadi kesalahan.
1 |
public function exec() |
2 |
{
|
3 |
$argument_count = func_num_args(); |
4 |
|
5 |
try
|
6 |
{
|
7 |
if ( ! $argument_count) throw new Exception("There is nothing to execute, no arguments specified."); |
8 |
|
9 |
$arguments = func_get_args(); |
10 |
|
11 |
$command_string = ($argument_count > 1) ? implode(" && ", $arguments) : $arguments[0]; |
12 |
|
13 |
$stream = @ssh2_exec($this->connection, $command_string); |
14 |
if ( ! $stream) throw new Exception("Unable to execute the specified commands: <br />{$command_string}"); |
15 |
|
16 |
}
|
17 |
catch
|
18 |
{
|
19 |
|
20 |
}
|
21 |
}
|
Itu saja untuk blok try! Di dalam blok catch, kita hanya akan memanggil metode error_message() untuk menampilkan pesan kesalahan kepada pengguna kita. Dengan blok try dan catch sekarang telah selesai, kita akan
mengembalikan $this pada akhir metode exec() yang akan membuat metode ini dapat dilakukan!
1 |
public function exec() |
2 |
{
|
3 |
$argument_count = func_num_args(); |
4 |
|
5 |
try
|
6 |
{
|
7 |
if ( ! $argument_count) throw new Exception("There is nothing to execute, no arguments specified."); |
8 |
|
9 |
$arguments = func_get_args(); |
10 |
|
11 |
$command_string = ($argument_count > 1) ? implode(" && ", $arguments) : $arguments[0]; |
12 |
|
13 |
$stream = @ssh2_exec($this->connection, $command_string); |
14 |
if ( ! $stream) throw new Exception("Unable to execute the specified commands: <br />{$command_string}"); |
15 |
|
16 |
}
|
17 |
catch
|
18 |
{
|
19 |
$this->error_message($e->getMessage()); |
20 |
}
|
21 |
|
22 |
return $this; |
23 |
}
|
Langkah 4 - Menuliskan CronTab ke File
Metode selanjutnya, write_to_file(), yang akan bertugas untuk menulis cronTab yang ada ke file sementara atau membuat temp kosong. file seharusnya tidak ada cron job. Ini akan mengambil dua argumen
- path untuk file sementara yang akan kita buat
- nama yang harus kita gunakan saat membuatnya.
Melanjutkan logika metode konstruktor dan exec, kita akan menetapkan nilai default untuk argumen ini sebagai NULL.
1 |
public function write_to_file($path=NULL, $handle=NULL) |
2 |
{
|
3 |
|
4 |
}
|
Hal pertama yang akan kita lakukan di sini adalah memeriksa apakah file cron sudah ada, dengan menggunakan metode boolean crontab_file_exists(),
yang akan segera kita buat. Jika file itu ada, tidak perlu diproses. Jika tidak, kita akan menggunakan operator terner untuk memeriksa properti $path dan $handle untuk menentukan apakah NULL atau tidak. Jika salah satu dari mereka adalah NULL, kita akan menggunakan fallback yang telah ditentukan dari konstruktor kita untuk menentukannya.
Kemudian, kita akan menggabungkan properti ini menjadi properti baru yang akan mewakili path lengkap dan nama file untuk file cron sementara.
1 |
public function write_to_file($path=NULL, $handle=NULL) |
2 |
{
|
3 |
if ( ! $this->crontab_file_exists()) |
4 |
{
|
5 |
$this->handle = (is_null($handle)) ? $this->handle : $handle; |
6 |
$this->path = (is_null($path)) ? $this->path : $path; |
7 |
|
8 |
$this->cron_file = "{$this->path}{$this->handle}"; |
9 |
}
|
10 |
}
|
Selanjutnya, kita akan menggunakan crontab perintah Linux, dengan argumen -l, untuk menampilkan cronTab pengguna sebagai output standar. Kemudian, dengan menggunakan operator Linux >, kita akan mengarahkan output standar, atau STDOUT, ke file cron sementara kita, bukan dengan menggabungkan $this-> cron_file menjadi command string! Mengalihkan output ke file, menggunakan operator >, akan selalu membuat file itu jika tidak ada.
1 |
public function write_to_file($path=NULL, $handle=NULL) |
2 |
{
|
3 |
if ( ! $this->crontab_file_exists()) |
4 |
{
|
5 |
$this->handle = (is_null($handle)) ? $this->handle : $handle; |
6 |
$this->path = (is_null($path)) ? $this->path : $path; |
7 |
|
8 |
$this->cron_file = "{$this->path}{$this->handle}"; |
9 |
|
10 |
$init_cron = "crontab -l > {$this->cron_file}"; |
11 |
}
|
12 |
}
|
Ini bekerja sangat baik tapi hanya jika sudah ada job yang dijadwalkan di dalam cronTab. Jika tidak ada job pada cron, file ini tidak akan pernah dibuat! Dengan menggunakan operator &&, kita bisa menambahkan perintah / ungkapan tambahan ke string ini. Jadi, mari tambahkan ekspresi kondisional untuk memeriksa apakah file cron ada. Jika file tidak ada, ekspresi ini akan dievaluasi menjadi false. Dengan demikian, kita bisa menggunakan || atau "or" operator setelah ini bersyarat untuk membuat file kosong baru jika diperlukan!
Perintah yang ditempatkan setelah "or" akan dijalankan jika kondisi / kondisi dievaluasi menjadi false. Sekarang, dengan menggunakan operator > lagi, kali ini tanpa
mendahului dengan perintah tertentu, kita bisa membuat file kosong baru! Jadi, intinya, rangkaian perintah ini akan menampilkan cronTab ke sebuah
file, lalu periksa apakah file itu ada, yang akan menunjukkan bahwa ada
entri di cronTab dan kemudian buat file kosong baru jika belum ada!
1 |
public function write_to_file($path=NULL, $handle=NULL) |
2 |
{
|
3 |
if ( ! $this->crontab_file_exists()) |
4 |
{
|
5 |
$this->handle = (is_null($handle)) ? $this->handle : $handle; |
6 |
$this->path = (is_null($path)) ? $this->path : $path; |
7 |
|
8 |
$this->cron_file = "{$this->path}{$this->handle}"; |
9 |
|
10 |
$init_cron = "crontab -l > {$this->cron_file} && [ -f {$this->cron_file} ] || > {$this->cron_file}"; |
11 |
}
|
12 |
}
|
Terakhir, kita akan memanggil metode exec() dan meneruskan string perintah ke argumen tersebut sebagai satu-satunya argumen. Kemudian, untuk membuat metode ini dapat diimbangi juga, kita akan mengembalikan $this.
1 |
public function write_to_file($path=NULL, $handle=NULL) |
2 |
{
|
3 |
if ( ! $this->crontab_file_exists()) |
4 |
{
|
5 |
$this->handle = (is_null($handle)) ? $this->handle : $handle; |
6 |
$this->path = (is_null($path)) ? $this->path : $path; |
7 |
|
8 |
$this->cron_file = "{$this->path}{$this->handle}"; |
9 |
|
10 |
$init_cron = "crontab -l > {$this->cron_file} && [ -f {$this->cron_file} ] || > {$this->cron_file}"; |
11 |
|
12 |
$this->exec($init_cron); |
13 |
}
|
14 |
|
15 |
return $this; |
16 |
}
|
Langkah 5 - Membuang File Cron Sementara
Metode ini, remove_file() sangat mudah! Kita akan menggunakan metode penolong kita, crontab_file_exists(), untuk memeriksa keberadaan file cron sementara dan kemudian jalankan perintah Linux rm untuk menghapusnya jika tidak. Seperti biasa, kita juga akan mengembalikan $this untuk menjaga chainability.
1 |
public function remove_file() |
2 |
{
|
3 |
if ($this->crontab_file_exists()) $this->exec("rm {$this->cron_file}"); |
4 |
|
5 |
return $this; |
6 |
}
|
Langkah 6 - Membuat Cron Job Baru
Metode ini akan menciptakan cron job baru dengan cara menambahkan job baru / baris ke file cron sementara dan kemudian mengeksekusi perintah crontab pada file yang akan menginstal semua job tersebut sebagai cronTab baru. Dengan demikian, append_cronjob() akan mengambil satu argumen, $cron_jobs, yang akan berupa string atau rangkaian string yang mewakili tugas cron untuk ditambahkan.
Kita akan memulai metode ini dengan menentukan apakah argumen $cron_jobs adalah NULL. Jika ya, kita akan memanggil metode error_message() untuk menghentikan eksekusi lebih lanjut dan menampilkan pesan kesalahan kepada pengguna.
1 |
public function append_cronjob($cron_jobs=NULL) |
2 |
{
|
3 |
if (is_null($cron_jobs)) $this->error_message("Nothing to append! Please specify a cron job or an array of cron jobs."); |
4 |
|
5 |
}
|
Intinya, kita bisa menggunakan echo pada tugas kita ke file cron dengan mengarahkan output standar ke dalam file lagi.
Selanjutnya, kita akan mendefinisikan variabel baru, $append_cronfile, sebagai string, dengan teks "echo" diikuti oleh spasi dan satu kutipan tunggal di akhir. Kita akan mengisi string ini dengan berbagai tugas cron yang kita tambahkan sekaligus kutipan penutup, untuk sementara. Kita akan membangun string ini menggunakan operator concatenation string .=.
Dengan menggunakan operator terner, kita akan menentukan apakah $cron_jobs adalah array atau tidak. Jika ya, kita akan menerapkan array itu dengan baris baru, \ n, sehingga setiap tugas cron ditulis di baris itu sendiri di dalam file cron. Jika argumen $cron_jobs bukan array, kita hanya akan menggabungkan job itu ke string $append_cron tanpa pemrosesan khusus. Dengan cara ini, kita akan memiliki string yang diformat dengan benar
terlepas dari apakah kita bekerja dengan array atau tidak.
Intinya, kita bisa menggunakan echo pada tugas kita ke file cron dengan mengarahkan output standar ke dalam file lagi. Jadi, dengan menggunakan operator concatenation string, kita akan menambahkan kutipan tunggal penutup ke string perintah dan juga operator Linux >> diikuti oleh path lengkap dan nama file untuk file cron. Operator >>, tidak seperti operator > yang selalu menimpa file, menambahkan keluaran ke akhir file. Jadi dengan menggunakan operator ini, kita tidak akan menimpa cron job yang ada.
1 |
public function append_cronjob($cron_jobs=NULL) |
2 |
{
|
3 |
if (is_null($cron_jobs)) $this->error_message("Nothing to append! Please specify a cron job or an array of cron jobs."); |
4 |
|
5 |
$append_cronfile = "echo '"; |
6 |
|
7 |
$append_cronfile .= (is_array($cron_jobs)) ? implode("\n", $cron_jobs) : $cron_jobs; |
8 |
|
9 |
$append_cronfile .= "' >> {$this->cron_file}"; |
10 |
|
11 |
}
|
Sekarang kita akan mendefinisikan sebuah variabel, sebagai sebuah string, dengan perintah yang akan kita gunakan untuk menginstal file cron baru yang akan kita buat! Ini semudah memanggil perintah crontab diikuti dengan path dan nama file dari file cron.
Sebelum menjalankan perintah ini melalui metode exec(), pertama-tama, kita akan memanggil metode write_to_file() untuk membuat file cron sementara. Kemudian, dalam rantai, kita akan menjalankan perintah ini dan memanggil metode remove_file() untuk menghapus file sementara. Terakhir, kita akan return $this sehingga metode append_cronjob() dapat disesuaikan.
1 |
public function append_cronjob($cron_jobs=NULL) |
2 |
{
|
3 |
if (is_null($cron_jobs)) $this->error_message("Nothing to append! Please specify a cron job or an array of cron jobs."); |
4 |
|
5 |
$append_cronfile = "echo '"; |
6 |
|
7 |
$append_cronfile .= (is_array($cron_jobs)) ? implode("\n", $cron_jobs) : $cron_jobs; |
8 |
|
9 |
$append_cronfile .= "' >> {$this->cron_file}"; |
10 |
|
11 |
$install_cron = "crontab {$this->cron_file}"; |
12 |
|
13 |
$this->write_to_file()->exec($append_cronfile, $install_cron)->remove_file(); |
14 |
|
15 |
return $this; |
16 |
}
|
Langkah 7 - Menghapus Cron Job yang Ada
Sekarang kita bisa menciptakan cron job baru, hanya logis jika kita memiliki kemampuan untuk menghapusnya juga! Metode remove_cronjob() akan mengambil satu argumen yang akan menjadi regular expression (sederhana). RegEx ini akan digunakan untuk menemukan pekerjaan yang sesuai dalam cronTab dan menghapusnya sesuai dengan itu. Seperti metode append_cronjob(), hal pertama yang akan kita lakukan adalah memeriksa apakah argumen $cron_jobs adalah NULL dan menghentikan eksekusi jika ada. Jika tidak, kita akan memanggil metode create_file() untuk menulis cron tab ke sebuah file.
1 |
public function remove_cronjob($cron_jobs=NULL) |
2 |
{
|
3 |
if (is_null($cron_jobs)) $this->error_message("Nothing to remove! Please specify a cron job or an array of cron jobs."); |
4 |
|
5 |
$this->write_to_file(); |
6 |
|
7 |
}
|
Dengan file cron yang dibuat, sekarang kita akan membacanya menjadi sebuah array dengan menggunakan fungsi PHP file(). Fungsi ini akan mengurai file yang diberikan menjadi array dengan setiap baris sebagai elemen array. Kita akan meneruskan file cron kita ke fungsi ini sebagai argumen
pertama dan kemudian menetapkan special flag, FILE_IGNORE_NEW_LINES, yang akan memaksa file() untuk mengabaikan semua baris baru. Jadi, kita akan memiliki array hanya dengan cron job itu sendiri!
Jika tidak ada jadwal cron yang dijadwalkan, array ini akan kosong. Selanjutnya, tidak akan ada alasan untuk melanjutkan. Dengan demikian, kita akan memeriksa apakah $cron_array kosong dan menghentikan eksekusi jika ya.
Jika cronTab tidak kosong, maka kita akan menghitung elemen dalam $cron_array menggunakan fungsi PHP count(). Kita akan menyimpan nilai ini sebagai $original_count. Kita akan segera menggunakannya untuk menentukan apakah kita telah menghapus cron job dari $cron_array.
1 |
public function remove_cronjob($cron_jobs=NULL) |
2 |
{
|
3 |
if (is_null($cron_jobs)) $this->error_message("Nothing to remove! Please specify a cron job or an array of cron jobs."); |
4 |
|
5 |
$this->write_to_file(); |
6 |
|
7 |
$cron_array = file($this->cron_file, FILE_IGNORE_NEW_LINES); |
8 |
|
9 |
if (empty($cron_array)) $this->error_message("Nothing to remove! The cronTab is already empty."); |
10 |
|
11 |
$original_count = count($cron_array); |
12 |
|
13 |
}
|
Sekarang, kita akan menentukan apakah argumen $cron_jobs adalah array atau tidak. Jika array, kita akan iterate melalui foreach loop. Dalam loop itu kita hanya akan menjalankan satu fungsi, preg_grep(). Fungsi nifty ini, tidak seperti preg_match(), akan mengembalikan array dari semua elemen array yang sesuai dengan ekspresi reguler yang ditentukan. Dalam kasus ini, bagaimanapun, kita ingin elemen array yang tidak cocok. Dengan kata lain, kita memerlukan serangkaian semua tugas cron yang akan
kita simpan sehingga kita dapat menginisialisasi cronTab hanya dengan
pekerjaan ini. Dengan demikian, kita akan menetapkan special flag di sini,
PREG_GREP_INVERT, yang akan menyebabkan preg_grep() mengembalikan semua elemen yang tidak sesuai dengan reguler expression. Jadi, kita akan memiliki serangkaian semua cron job yang ingin kita simpan!
1 |
public function remove_cronjob($cron_jobs=NULL) |
2 |
{
|
3 |
if (is_null($cron_jobs)) $this->error_message("Nothing to remove! Please specify a cron job or an array of cron jobs."); |
4 |
|
5 |
$this->write_to_file(); |
6 |
|
7 |
$cron_array = file($this->cron_file, FILE_IGNORE_NEW_LINES); |
8 |
|
9 |
if (empty($cron_array)) $this->error_message("Nothing to remove! The cronTab is already empty."); |
10 |
|
11 |
$original_count = count($cron_array); |
12 |
|
13 |
if (is_array($cron_jobs)) |
14 |
{
|
15 |
foreach ($cron_jobs as $cron_regex) $cron_array = preg_grep($cron_regex, $cron_array, PREG_GREP_INVERT); |
16 |
}
|
17 |
else
|
18 |
{
|
19 |
|
20 |
}
|
21 |
}
|
Jika argumen $cron_jobs bukan array, kita akan melanjutkan dengan cara yang sama namun tanpa iterasi apapun. Sekali lagi, kita akan mendefinisikan ulang $cron_array sebagai rangkaian hasil dari fungsi preg_grep() dengan flag PREG_GREP_INVERT.
1 |
public function remove_cronjob($cron_jobs=NULL) |
2 |
{
|
3 |
if (is_null($cron_jobs)) $this->error_message("Nothing to remove! Please specify a cron job or an array of cron jobs."); |
4 |
|
5 |
$this->write_to_file(); |
6 |
|
7 |
$cron_array = file($this->cron_file, FILE_IGNORE_NEW_LINES); |
8 |
|
9 |
if (empty($cron_array)) $this->error_message("Nothing to remove! The cronTab is already empty."); |
10 |
|
11 |
$original_count = count($cron_array); |
12 |
|
13 |
if (is_array($cron_jobs)) |
14 |
{
|
15 |
foreach ($cron_jobs as $cron_regex) $cron_array = preg_grep($cron_regex, $cron_array, PREG_GREP_INVERT); |
16 |
}
|
17 |
else
|
18 |
{
|
19 |
$cron_array = preg_grep($cron_jobs, $cron_array, PREG_GREP_INVERT); |
20 |
}
|
21 |
}
|
Dengan set $cron_array kita, sekarang, kita akan membandingkan panjang array saat ini dengan panjang asli yang kita cache dalam variabel $original_count. Jika panjangnya identik, kita hanya akan mengembalikan metode remove_file() untuk menghapus file cron sementara. Jika tidak cocok, kita akan menghapus cronTab yang ada dan kemudian menginstal yang baru!
Metode remove_file(), remove_crontab() dan append_cronjob() mengembalikan semua $this sehingga dengan mengembalikan metode ini, kita masih melestarikan kemampuan metode ini.
1 |
public function remove_cronjob($cron_jobs=NULL) |
2 |
{
|
3 |
if (is_null($cron_jobs)) $this->error_message("Nothing to remove! Please specify a cron job or an array of cron jobs."); |
4 |
|
5 |
$this->write_to_file(); |
6 |
|
7 |
$cron_array = file($this->cron_file, FILE_IGNORE_NEW_LINES); |
8 |
|
9 |
if (empty($cron_array)) $this->error_message("Nothing to remove! The cronTab is already empty."); |
10 |
|
11 |
$original_count = count($cron_array); |
12 |
|
13 |
if (is_array($cron_jobs)) |
14 |
{
|
15 |
foreach ($cron_jobs as $cron_regex) $cron_array = preg_grep($cron_regex, $cron_array, PREG_GREP_INVERT); |
16 |
}
|
17 |
else
|
18 |
{
|
19 |
$cron_array = preg_grep($cron_jobs, $cron_array, PREG_GREP_INVERT); |
20 |
}
|
21 |
|
22 |
return ($original_count === count($cron_array)) ? $this->remove_file() : $this->remove_crontab()->append_cronjob($cron_array); |
23 |
}
|
Langkah 8 - Menghapus Crontab Keseluruhan
Menghapus seluruh cronTab relatif mudah dilakukan. Akhirnya, kita hanya akan menjalankan perintah crontab dengan flag -r yang menghapus seluruh cronTab untuk pengguna tertentu. Karena crontab telah dihapus, kita mungkin juga menghapus file cron sementara juga, jika ada. Kemudian kita akan mengembalikan $this untuk melestarikan chainability.
1 |
public function remove_crontab() |
2 |
{
|
3 |
$this->exec("crontab -r")->remove_file(); |
4 |
|
5 |
return $this; |
6 |
}
|
Langkah 9 - Beberapa Metode Bermanfaat
Dengan beban kelas manajemen cron yang sudah tertulis, sekarang kita akan melihat dua metode kecil namun berguna yang telah kita gunakan di seluruh class kita, crontab_file_exists() dan error_message().
- $this->crontab_file_exists()
Metode ini hanya akan mengembalikan hasil metode PHP
file_exists(), true atau false, tergantung pada apakah ada file cron sementara atau tidak.
1 |
private function crontab_file_exists() |
2 |
{
|
3 |
return file_exists($this->cron_file); |
4 |
}
|
- $this->error_message($error)
Metode ini akan mengambil satu argumen, sebuah string, mewakili pesan kesalahan yang ingin kita tampilkan. Kami kemudian akan memanggil metode PHP
die()untuk menghentikan eksekusi dan menampilkan pesan ini. String itu sendiri, akan digabungkan menjadi elemen<pre>dengan beberapa gaya sederhana yang diterapkan padanya.
1 |
private function error_message($error) |
2 |
{
|
3 |
die("<pre style='color:#EE2711'>ERROR: {$error}</pre>"); |
4 |
}
|
Langkah 10 - Menempatkan semuanya!
Setelah menyelesaikan class manajemen cron kita, mari kita lihat beberapa contoh bagaimana menggunakannya!
- Instantiating class dan membangun koneksi yang otentik:
Pertama, mari kita membuat instance baru dari class kita. Ingat, kita harus melewati alamat ip, port, username dan password ke class constructor.
1 |
$crontab = new Ssh2_crontab_manager('11.11.111.111', '22', 'my_username', 'my_password'); |
- Menambahkan tugas cron tunggal:
Dengan koneksi yang otentik, mari kita lihat bagaimana kita bisa membuat tugas cron tunggal yang baru.
1 |
$crontab = new Ssh2_crontab_manager('11.11.111.111', '22', 'my_username', 'my_password'); |
2 |
$crontab->append_cronjob('30 8 * * 6 home/path/to/command/the_command.sh >/dev/null 2>&1'); |
- Menambahkan array cron jobs:
Menambahkan beberapa cron job semudah menambahkan cron job tunggal. Kita hanya akan mengirimkan sebuah array ke metode
append_cronjob().
1 |
$crontab = new Ssh2_crontab_manager('11.11.111.111', '22', 'my_username', 'my_password'); |
2 |
|
3 |
$new_cronjobs = array( |
4 |
'0 0 1 * * home/path/to/command/the_command.sh', |
5 |
'30 8 * * 6 home/path/to/command/the_command.sh >/dev/null 2>&1'
|
6 |
);
|
7 |
|
8 |
$crontab->append_cronjob($new_cronjobs); |
- Menghapus cron job tunggal:
Dengan cara bagaimana cara membuat satu tugas cron, sekarang kita akan menghapusnya. Kali ini, bagaimanapun, kita akan menggunakan regular expression untuk menemukan tugas yang sesuai. RegEx ini bisa sesederhana atau serumit yang Anda butuhkan. Sebenarnya, ada beberapa cara untuk melakukan regex untuk tugas yang Anda cari. Sebagai contoh, jika tugas yang perlu Anda hapus adalah unik karena perintah yang dijalankan tidak digunakan di tempat lain di cronTab, Anda bisa dengan sederhana menentukan nama perintah seperti Anda dalam menggunakan regEx. Selanjutnya, jika Anda ingin menghapus semua tugas untuk bulan tertentu, Anda cukup menuliskan kalimat biasa untuk menemukan kecocokan untuk semua pekerjaan pada bulan tertentu!
1 |
$crontab = new Ssh2_crontab_manager('11.11.111.111', '22', 'my_username', 'my_password'); |
2 |
|
3 |
$cron_regex = '/home\/path\/to\/command\/the_command\.sh\/'; |
4 |
|
5 |
$crontab->remove_cronjob($cron_regex); |
- Menghapus array cron jobs:
Menghapus beberapa cronjobs ditangani dengan cara yang sama seperti menghapus cronJob tunggal dengan satu pengecualian, kita akan melewatkan array regular expression tugas cron ke metode
remove_cronjob().
1 |
$crontab = new Ssh2_crontab_manager('11.11.111.111', '22', 'my_username', 'my_password'); |
2 |
|
3 |
$cron_regex = array( |
4 |
'/0 0 1 \* \*/', |
5 |
'/home\/path\/to\/command\/the_command\.sh\/'
|
6 |
);
|
7 |
|
8 |
$crontab->remove_cronjob($cron_regex); |
Kesimpulan
Itu semua orang! Saya harap Anda menikmati ketika membaca artikel ini sebanyak apa yang saya senang menuliskannya dan bahwa Anda telah mendapatkan wawasan baru tentang cronTab dan mengelolanya dengan PHP. Terima kasih banyak telah membaca!



