Pada tulisan saya sebelumnya (Multiproses (Forking) di PHP (Bagian 1), Multiproses (Forking) di PHP (Bagian 2), dan Multiproses (Forking) di PHP (Bagian 3)), saya sudah menjelaskan sedikit tentang apa itu multiproses, multithread, dan bagaimana cara mengimplementasikan multiproses programming menggunakan bahasa pemrograman PHP di sistem barbasis Unix. Kali ini, saya akan menjelaskan bagaimana supaya proses yang dibuat dapat berkomunikasi antara proses satu dengan proses lainnya atau inter-process communication (IPC).
Pendahuluan
IPC adalah sebuah teknik untuk pertukaran data antara proses-proses yang terpisah (multiproses). Ada banyak teknik yang digunakan dalam penggunaan IPC ini, antara lain adalah pipes, sockets, files, shared memory, dll. Kali ini saya akan memberikan contoh bagaimana mengimplementasikan shared memory segments menggunakan bahasa pemrograman PHP untuk komunikasi antar proses.
Apakah yang dimaksud dengan shared memory segments? shared memory segments adalah teknik dalam penggunaan IPC yang memanfaatkan sebuah blok di memori yang dapat diakses oleh proses lain pada satu sistem. Satu kelebihan yang didapatkan dari penggunaan shared memory segments ini adalah terjaminnya komunikasi antar proses yang sangat cepat, namun kelemahan utamanya adalah hanya dapat digunakan dalam satu sistem operasi (mesin).
Fungsi di PHP
Pada bahasa pemrograman PHP, terdapat 5 (lima) buah fungsi yang sering digunakan dalam implementasi shared memory segments ini, yaitu:
-
shm_attach(int key [, int memsize [, int perm]])
Membuat/mendapatkan shared memory segments.$key (int)
bernilai integer dan sebagai identitas shared memory segments yang dibuat di memori. Untuk dapat mengakses shared memory segments secara bersama-sama antar proses, nilai ini harus dideklarasikan sama persis di semua proses.$memsize (int)
adalah besarnya memori yang akan dipakai untuk shared memory segments.$perm (int)
adalah hak akses untuk shared memory segments (Unix style). Nilai default untuk hak akses adalah 0666, yang berarti dapat ditulis dan dibaca oleh siapa saja.
-
shm_put_var(int shm_identifier, int variable_key, mixed variable)
Menambahkan/memperbarui data di shared memory segments.$shm_identifier (int)
adalah identitas shared memory segments yang didapatkan oleh fungsishm_attach()
.$variable_key (int)
bernilai integer yang digunakan sebagai indek dari data yang disimpan.$variable
adalah data yang akan disimpan. Ukuran dari data yang disimpan harus sama atau lebih kecil dari ukuran memori yang didefinisikan pada fungsishm_attach()
.
-
shm_get_var(int shm_identifier, int variable_key)
Mendapatkan data di shared memory segments.$shm_identifier (int)
adalah identitas shared memory segments yang didapatkan oleh fungsishm_attach()
.$variable_key (int)
adalah indek dari data yang disimpan (bernilai integer).
-
shm_remove(int shm_identifier)
Menghapus memori dari sistem.$shm_identifier (int)
adalah identitas shared memory segments yang didapatkan oleh fungsishm_attach()
.
-
shm_detach(int shm_identifier)
Disconnects dari shared memory segments.$shm_identifier (int)
adalah identitas shared memory segments yang didapatkan oleh fungsishm_attach()
.
Terdapat perbedaan antara fungsi shm_detach()
dan fungsi shm_remove()
. Ketika menggunakan fungsi shm_detach()
, data yang tersimpan di shared memory segments masih ada sampai data tersebut ditimpa oleh yang lainnya. Untuk keamanan, selalu gunakan fungsi shm_remove()
untuk menghapus data di shared memory segments.
Implementasi Shared Memory Segments di PHP
Berikut adalah contoh kode pengimplementasiannya di PHP. Kode berikut untuk proses kesatu (proses1.php
):
<?php
// #!/usr/bin/php -q
// deklarasi opsi
$key = 123;
$memsize = 1024; // 1024 bytes atau 1kb
$shm = shm_attach($key, $memsize);
// simpan data bertipe string
shm_put_var($shm, 1, 'Hello World');
// simpan data bertipe array
shm_put_var($shm, 2, array('Hello', 'World'));
echo "Data tersimpan di memori.....\n";
?>
Dan kode dibawah ini adalah untuk proses kedua (proses2.php
):
<?php
// #!/usr/bin/php -q
// deklarasi opsi
$key = 123;
$memsize = 1024; // 1024 bytes atau 1kb
$shm = shm_attach($key, $memsize);
// ambil data di memori
echo "Data pertama : " . shm_get_var($shm, 1) . "\n";
$array = shm_get_var($shm, 2);
echo "Data kedua : {$array[0]} dan {$array[1]}\n";
?>
Kedua kode di atas saya coba jalankan pada 2 terminal yang berbeda. Ketika kode pertama saya jalankan pada terminal 1 (satu) maka hasil yang muncul adalah:
Data tersimpan di memori.....
Dan setelah kode pertama dieksekusi, saya coba jalankan kode kedua di terminal lainnya (terminal 2), dan hasil yang muncul adalah:
Data pertama : Hello World
Data kedua : Hello dan World
Demikian saya jelaskan implementasi sederhana shared memory segments pada bahasa pemrograman PHP untuk komunikasi antara proses satu dengan proses lainnya.