Memperkenalkan, Semaphore di PHP. Edgar Djikstra telah menyumbang banyak sekali hal penting di dunia komputer dan diantaranya adalah semaphore. Konsep yang ditemukan untuk membantu masalah concurrency. Semaphore merupakan inti (core) dari setiap sistem operasi. Semaphore dapat digunakan untuk menyediakan akses eksklusif pada suatu resource pada satu mesin yang sama, atau bisa dikatakan untuk membatasi/mengontrol akses secara bersamaan terhadap satu resource. Semaphore banyak diterapkan pada aplikasi multithread dan multiprocess.
Semaphore bisa diibaratkan lampu lalu lintas yang sering kita jumpai di jalan-jalan. Yang mengatur antrian untuk menggunakan jalan (resource) yang sama. Sebagai contoh yang banyak ditemui adalah aplikasi yang dapat mengakses database. Pertama kali, aplikasi tersebut harus mendapatkan token menggunakan semaphore (acquire) dan memblok aplikasi lain untuk menggunakannya. Setelah diperoleh, jalankan query, dan kemudian melepaskan token semaphore sehingga aplikasi lain dapat menggunakannya. Metode semaphore ini bisa ditemukan dalam sistem tabungan di Bank. Tanpa adanya semaphore di sistemnya, pada suatu saat memiliki perputaran uang yang sangat tinggi dan saling bertransaksi satu sama lain dalam waktu yang sama, maka dijamin Bank itu gulung tikar hanya dalam beberapa detik.
Semaphore memiliki kelemahan. Ya, mudah memasuki keadaan deadlock, dimana aplikasi yang pertama menggunakan resource tersebut tidak pernah melepaskan/membebaskan semaphore dan semakin banyak aplikasi lain yang menunggu untuk menggunakan resource itu. Proses saling menunggu inilah yang akan membuat keadaan deadlock. Itulah mengapa, dibutuhkan ketelitian ekstra hati-hati ketika menggunakan semaphore. Pastikan bahwa semua token semaphore harus dilepaskan/dibebaskan. Semaphore bukanlah barang yang ajaib yang bisa mengatur tanpa ada kecelakaan.
Implementasi Semaphore di PHP
Menurut manual di PHP, semaphore tidak dapat digunakan dalam platform Windows. Semaphore terdapat pada System V Unix dan semaphore ini banyak ditemui pada aplikasi PHP mode CLI (Command Line Interface). Artinya tidak memerlukan web server untuk menjalankannya. Memang bisa dikatakan sangat jarang sekali para developer web menggunakan fungsi ini. Dan tentu saja, aplikasi PHP CLI sama powerfull-nya dengan aplikasi PHP yang menggunakan web server. PHP CLI ini bisa dipakai untuk network programming, background service, dll.
Hanya ada 4 fungsi yang disediakan untuk semaphore di PHP, yaitu:
-
Membuat/mendapat semaphore
sem_get(int key [, int max_acquire [, int perm [, int auto_release]]])
-
Memperoleh token semaphore
sem_acquire(resource sem_identifier)
-
Membebaskan/melepaskan token semaphore
sem_release(resource sem_identifier)
-
Menghapus semaphore
sem_remove(resource sem_identifier)
Bagaimanakah menggunakan fungsi-fungsi di atas? Pertama, dapatkan identitas dengan cara memanggil sem_get()
. Kemudian panggil sem_acquire()
untuk mencoba mendapatkan token, sem_acquire()
akan membloknya supaya tidak bisa diakses oleh proses lainnya. Setelah token didapat, kita dapat mengakses resource dan mengendalikannya. Setelah selesai, panggil sem_release()
sehingga proses lain yang menunggu dapat memperoleh semaphore. Ketika semua sudah dilakukan, kita dapat menghapus semaphore tersebut dengan sem_remove()
.
Pada tulisan selanjutnya, akan saya berikan contoh kode PHP dalam implementasi semaphore ini :)