Pada tulisan Multiproses (Forking) di PHP (Bagian 1) dan Multiproses (Forking) di PHP (Bagian 2), saya sudah menjelaskan sedikit tentang apa itu multiproses, multithread, dan contoh sederhana penggunaan fungsi pcntl_fork()
untuk menciptakan proses baru di PHP mode CLI. Kali ini, saya akan jelaskan mengenai signals yang digunakan untuk komunikasi dan sinkronisasi proses.
Signal merupakan salah satu metode komunikasi antar proses di sistem Unix. Signal adalah pesan singkat yang dikirim ke suatu proses atau sekumpulan proses untuk memberitahukan suatu proses mengenai system events, misalnya signal yang dihasilkan oleh keyboard saat ditekan oleh pengguna (contoh adalah CTRL + C
). Signal digunakan untuk komunikasi dan sinkronisasi proses, mempermudah inter-process communication (IPC) yang terdapat pada sistem Unix. Signal memiliki peranan penting dalam penanganan exception dan interrupt. Signal memiliki dua fungsi utama yaitu untuk membuat suatu proses mengetahui bahwa suatu event telah terjadi dan untuk memaksa proses mengeksekusi fungsi signal handler yang sudah dideklarasikan sebelumnya.
Untuk lebih memahami tentang apa itu signal, terlebih dahulu dapat Anda baca pada inter-process communication dan Unix signal. Dan kode di bawah ini adalah contoh penerapan signals handler di PHP. PHP Signals Handler 1 (phpsignal1.php
):
<?php
declare(ticks = 1);
function signal_handler($signal) {
switch($signal) {
case SIGTERM:
echo 'Shutdown.....';
exit;
break;
case SIGHUP:
echo 'Restart.....';
break;
}
}
pcntl_signal(SIGTERM, 'signal_handler');
pcntl_signal(SIGHUP, 'signal_handler');
?>
Pada contoh kode di atas, kita mendeklarasikan sebuah fungsi signals handler yang menangani 2 (dua) jenis signal yaitu signal untuk mematikan (SIGTERM
) dan signal untuk melakukan restart (SIGHUP
). Kemudian adalah melakukan registrasi terhadap fungsi tersebut menggunakan fungsi pcntl_signal()
. PHP Signals Handler 2 (phpsignal2.php
):
<?php
// #!/usr/bin/php -q
declare(ticks = 1);
function signal_handler($signal) {
switch ($signal) {
case SIGTERM:
echo "Shutdown.....\n";
exit;
break;
case SIGHUP:
echo "Restart.....\n";
break;
}
}
pcntl_signal(SIGTERM, 'signal_handler');
pcntl_signal(SIGHUP, 'signal_handler');
echo "Memanggil signal shutdown.....\n";
// matikan proses dirinya sendiri (bunuh diri)
posix_kill(posix_getpid(), SIGTERM);
echo "Selesai.....\n";
?>
Pada saat kode di atas dijalankan, maka akan muncul hasilnya seperti di bawah ini.
Memanggil signal shutdown.....
Shutdown.....
Terlihat bahwa deklarasi kode echo "Selesai.....\n";
tidak dieksekusi, ini disebabkan karena deklarasi kode posix_kill(posix_getpid(), SIGTERM);
telah mematikan proses yang ada terlebih dahulu.
Implementasi signals ini banyak digunakan untuk menjaga konsistensi pada pemrosesan sebuah data, contohnya adalah pemrosesan transaksi finansial (keuangan). Untuk memastikan bahwa sebuah transaksi keuangan berjalan dengan benar dan tanpa adanya kesalahan saat terjadi eksekusi untuk mematikan sebuah proses transaksi tersebut, maka diterapkanlah signals seperti ini.