Teknik Ninja Fine Tuning PHP-FPM: Buat aplikasi PHP kamu lebih kuat menghandle traffic

PHP hingga saat ini masih menjadi primadona pilihan sebagai bahasa pemrograman website. Hampir 80% dari seluruh situs di dunia ini dibuat menggunakan PHP. Terlebih lagi berbagai framework PHP juga sudah menggurita seperti Code Igniter, Yii, WordPress, Symfony, dan yang paling hits saat ini Laravel, memberikan kemudahan bagi web developer untuk membuat web dengan cepat. Namun dibalik kemudahan tersebut tentunya ada harga yang harus dibayarkan, yakni batasan performa PHP dalam menghandle traffic-traffic besar. Lantas apakah salah jika PHP digunakan untuk kebutuhan korporat dengan traffic tinggi ? Hal tersebut tentu dikembalikan ke kebutuhan bisnis antara harga re-engineering dengan tetap mempertahankan PHP. Jika pilihan mempertahankan PHP yang dipilih, tulisan ini mungkin cocok untuk kamu meningkatkan performa website PHP.

Baca Juga: Kapan Harus Berpindah ke GraphQL dan meninggalkan REST API ?

Catatan: Tulisan ini ditujukan untuk kamu yang telah memahami bahasa pemrograman PHP, dan memiliki kemampuan dasar konfigurasi server.

Konsep Dasar PHP-FPM

PHP-FPM adalah implementasi PHP sebagai FastCGI Process Manager (PHP-FPM) yang diatur untuk mengelola proses PHP secara efisien, termasuk alokasi sumber daya dan kontrol terhadap jumlah proses yang aktif. PHP-FPM memungkinkan pengaturan yang lebih fleksibel terhadap jumlah dan perilaku proses PHP yang aktif. Hal ini termasuk pengaturan jumlah maksimum proses (max children), proses yang aktif secara minimal (start servers), serta aturan lain yang mengatur bagaimana proses PHP ditangani dan diatur oleh server web. Berbeda dengan Apache2, XAMPP, LAMP, dan turunan lainnya, PHP-FPM fokus pada manajemen proses PHP, sementara XAMPP dan LAMP mencakup web server (Apache), database server (MySQL), dan bahasa pemrograman (PHP/Perl/Python) dalam satu wadah.

Teknik 1: Menyesuaikan Jumlah Proses Pekerja (Workers)

Empat parameter utama yang perlu diatur adalah jumlah proses pekerja (workers). Secara default, PHP-FPM biasanya diatur untuk mengelola jumlah ini secara otomatis, tetapi untuk menghandle traffic yang besar, kamu perlu menyesuaikan jumlah ini berdasarkan karakteristik aplikasi dan spesifikasi server yang digunakan.

  • pm.max_children: Menentukan jumlah maksimum proses PHP yang dapat berjalan secara simultan.
  • pm.start_servers: Menentukan jumlah proses pekerja yang diinisialisasi saat PHP-FPM mulai.
  • pm.min_spare_servers dan pm.max_spare_servers: Menentukan jumlah minimum dan maksimum proses pekerja yang tetap berjalan untuk menangani permintaan.

Parameter-parameter ini dapat dijumpai pada /etc/php/{version}/fpm/pool.d/www.conf atau /etc/php/{version}/fpm/php-fpm.conf atau /usr/local/etc/php/{version}/php-fpm.conf

Dengan aplikasi yang kamu miliki, lakukan test performa website kamu dengan Apache JMeter, atau K6 Grafana sambil mengganti empat parameter tersebut agar didapatkan hasil yang paling optimal. Untuk kamu yang ingin mengoptimalisasikan seluruh resource server kamu untuk aplikasi PHP, banyak kalkulator online yang dapat membantu kamu untuk menghitung parameter tersebut seperti pada link berikut.

Baca Juga: Test Performa Website Praktis dengan K6 Grafana, Bisa Digunakan untuk DDOS

Teknik 2: Mengatur Timeout dan Koneksi

Ketika mengoptimalkan PHP-FPM, penting juga untuk memperhatikan pengaturan timeout dan koneksi agar sesuai dengan kebutuhan aplikasi. Timeout yang terlalu lama akan membuat penumpukan antrian request pada memori sehingga server mengalami out of memory. Dua parameter yang dapat diubah untuk menjawab hal tersebut :

  • request_terminate_timeout: Menentukan waktu maksimum dalam detik untuk sebuah proses PHP sebelum diakhiri secara paksa.
  • request_slowlog_timeout: Menentukan waktu dalam detik untuk menandai permintaan yang dianggap lambat.

Dua parameter ini juga berada pada file konfigurasi yang sama dengan parameter-parameter pada teknik pertama. Secara default PHP menempatkan 30 detik untuk timeout. Sehingga jika terdapat suatu permasalahan dengan backend lain, suatu request akan ditunggu selama 30 detik sebelum diterminasi. Dapat dibayangkan antrian request yang mengantri saat terjadi lonjakan. Memilih nilai-nilai ini dengan bijak dapat membantu menghindari overloading server dan memperbaiki waktu tanggapan aplikasi.

Teknik 3: Menerapkan Caching dan Optimasi Kode

Selain melakukan fine tuning pada PHP-FPM, menerapkan caching di tingkat aplikasi dan optimasi kode PHP dapat secara signifikan meningkatkan kinerja aplikasi. Secara umum tiga metode caching dapat kamu lakukan:

  • Client-Side Caching: Menyimpan data dan konten di browser atau perangkat pengguna, sehingga dapat diakses tanpa mengirimkan permintaan ke server. Caching sisi klien diimplementasikan menggunakan header HTTP, seperti Cache-Control, Expires, ETag, dan Last-Modified. Header ini menginstruksikan browser cara menyimpan cache dan memvalidasi konten. Caching sisi klien juga dapat diimplementasikan menggunakan API JavaScript seperti localStorage, sessionStorage, dan IndexedDB, yang memungkinkan penyimpanan data di penyimpanan browser.
  • Server-Side Caching: Teknik caching ini melibatkan penyimpanan data di server web atau server cache khusus, sehingga dapat diakses lebih cepat dan dengan lebih sedikit kueri basis data atau panggilan API eksternal. Caching sisi server dapat diimplementasikan menggunakan ekstensi PHP, seperti APCu, Memcached, dan Redis. Ekstensi ini menyediakan penyimpanan nilai kunci dalam memori yang dapat menyimpan dan mengambil data dengan cepat. Framework PHP, seperti Laravel, Symfony dan CodeIgniter juga menyediakan fitur caching bawaan dan integrasi dengan server cache, sehingga dapat digunakan untuk mengimplementasikan caching sisi server.
  • Reverse proxy caching: Ini melibatkan penyimpanan data pada server perantara, seperti Nginx atau Varnish, yang berada di antara server web dan klien. Server-server ini adalah perantara dan bertindak sebagai proxy yang mencegat dan menyimpan permintaan dan respons dalam cache. Reverse Proxy Caching dapat meningkatkan kinerja dan skalabilitas aplikasi web. Hal ini dicapai dengan mengurangi beban pada server web dan menyajikan konten cache ke banyak klien. Reverse proxy caching juga dapat memberikan fitur tambahan, seperti kompresi, enkripsi, penyeimbangan beban, dan keamanan.

Teknik 4: Memantau Penggunaan Sumber Daya

Pemantauan terus-menerus terhadap penggunaan CPU, memori, dan proses PHP sangat penting untuk mengetahui apakah konfigurasi PHP-FPM yang diterapkan sudah optimal atau masih memerlukan penyesuaian lebih lanjut. Gunakan alat pemantauan seperti top, htop, atau alat pemantauan khusus PHP-FPM untuk menganalisis kinerja aplikasi secara real-time. Penggunaan software seperti APM, Datadog, dan Grafana yang memiliki interface yang lebih baik juga dapat membantu hal ini.