Nginx dari Bab 12 dan Apache dari Bab 13 sudah terbukti sanggup menyajikan halaman example.local dan blog.example.local dengan baik, tetapi keduanya baru diuji dengan file HTML statis. Praktiknya, hampir semua aplikasi web yang benar-benar dipakai Client, mulai dari CMS seperti WordPress sampai framework modern seperti Laravel, membutuhkan konten yang dibentuk secara dinamis saat request masuk, bukan sekadar file yang dibaca apa adanya dari disk. Web server seperti Nginx dan Apache sebenarnya tidak tahu cara menjalankan kode PHP sama sekali, keduanya hanya pandai menyajikan file dan meneruskan request. Ada lapisan lain yang bertugas menerjemahkan file .php menjadi output HTML, dan itulah peran PHP beserta runtime-nya.
Bab ini membahas instalasi PHP dan ekstensi umum yang dibutuhkan aplikasi web, dilanjutkan dengan penjelasan dua model integrasi PHP ke web server yaitu mod_php dan PHP-FPM beserta alasan PHP-FPM menjadi pilihan standar saat ini. Setelah itu kita mempraktikkan langsung cara menghubungkan PHP-FPM ke Nginx lewat FastCGI dan ke Apache lewat mod_proxy_fcgi, memakai ulang virtual host example.local yang sudah dibangun di Bab 12 dan Bab 13. Bab ditutup dengan konfigurasi php.ini dasar, pengujian dengan script PHP sungguhan, dan pengenalan Composer sebagai dependency manager standar PHP yang dipakai hampir semua framework modern termasuk Laravel, sebagai bekal sebelum Bab 15 membahas reverse proxy dan load balancing untuk aplikasi backend yang lebih kompleks.
14.1 Instalasi PHP dan Ekstensi Umum untuk Kebutuhan Web
PHP adalah bahasa scripting server-side yang dirancang khusus untuk pengembangan web, dieksekusi di server sebelum hasilnya dikirim sebagai HTML biasa ke browser Visitor. Ubuntu Server menyediakan PHP langsung dari repository resmi, sehingga instalasinya tidak memerlukan repository pihak ketiga untuk kebutuhan standar.
14.1.1 Instalasi PHP-FPM dan PHP CLI dari Repository Ubuntu
Ada beberapa varian paket PHP di Ubuntu, tergantung cara PHP akan dijalankan. Untuk kebutuhan bab ini, kita memasang dua varian sekaligus, yaitu php-fpm untuk menjalankan PHP di balik web server, dan php-cli untuk menjalankan script PHP langsung dari terminal, yang juga berguna untuk keperluan pengujian dan troubleshooting.
Langkah Praktik
- Perbarui daftar paket, lalu pasang PHP-FPM dan PHP CLI.
Paketsudo apt update sudo apt install php-fpm php-cliphp-fpmdanphp-clisebenarnya adalah metapackage yang menarik versi PHP default Ubuntu, misalnyaphp8.4-fpmdanphp8.4-cli. Versi persisnya bisa berbeda tergantung kapan repository Ubuntu terakhir disinkronkan, jadi jangan heran jika angkanya tidak sama persis dengan contoh di modul ini. - Berbeda dari Nginx dan Apache yang langsung mendengarkan port begitu terpasang, PHP-FPM baru benar-benar berguna setelah dihubungkan ke web server di Bagian 14.3. Meskipun begitu, service-nya tetap otomatis aktif dan berjalan sejak instalasi selesai. Konfirmasi statusnya.
systemctl status php8.4-fpm.service - Periksa versi PHP yang benar-benar terpasang.
php -v
Verifikasi dan Troubleshooting
- Jika nama service
php8.4-fpm.servicetidak ditemukan, cek dulu versi PHP yang benar-benar terpasang lewatphp -v, lalu sesuaikan angka versinya pada semua perintahsystemctldi bab ini. - PHP-FPM mendengarkan lewat Unix socket, bukan port TCP, sehingga
ss -tlnptidak akan menampilkannya. Gunakan perintah berikut untuk memastikan socket-nya benar-benar dibuat.
Filels -l /run/php/php8.4-fpm.sockseharusnya sudah ada di sana begitu service aktif.
14.1.2 Ekstensi PHP Umum untuk Kebutuhan Web
Instalasi PHP dasar hanya menyertakan fungsi inti bahasa tersebut. Kebutuhan nyata seperti koneksi ke database, pengolahan gambar, atau membaca file XML memerlukan extension tambahan yang dipasang terpisah. Hampir semua CMS dan framework PHP modern, termasuk WordPress dan Laravel, mensyaratkan kombinasi ekstensi tertentu agar bisa berjalan tanpa error.
Langkah Praktik
- Pasang kumpulan ekstensi yang paling sering dibutuhkan aplikasi web PHP.
Sama sepertisudo apt install php-mysql php-pgsql php-curl php-mbstring php-xml php-zip php-gd php-intlphp-fpm, paket-paket ini adalah metapackage yang menarik versi spesifik sesuai PHP yang terpasang. Paketphp-mysqldanphp-pgsqlmasing-masing menyediakan driver untuk MySQL/MariaDB dan PostgreSQL, dua database yang akan kita pasang di Bab 17 dan Bab 18. Paketphp-curldipakai aplikasi untuk memanggil API eksternal,php-mbstringmenangani encoding string multi-byte seperti UTF-8,php-xmldanphp-zipdibutuhkan banyak proses import/export data, sedangkanphp-gdmenangani pengolahan gambar seperti thumbnail. - Restart PHP-FPM agar ekstensi baru benar-benar dimuat.
sudo systemctl restart php8.4-fpm - Pastikan ekstensi yang baru dipasang benar-benar terbaca oleh PHP.
php -m | grep -Ei 'mysqli|pgsql|curl|mbstring|gd'
Verifikasi dan Troubleshooting
- Di lapangan, error
Call to undefined functionpada aplikasi PHP yang baru dipindah ke server baru hampir selalu berarti ada ekstensi yang lupa dipasang, bukan bug di kode aplikasinya. Cocokkan pesan error dengan daftar ekstensi yang sudah aktif lewatphp -msebelum menuduh kode aplikasi bermasalah. - Menambah ekstensi baru di kemudian hari selalu perlu diikuti restart PHP-FPM, karena PHP memuat seluruh daftar ekstensinya hanya sekali saat proses pertama kali start, sama seperti kebiasaan restart module Apache yang sudah kita kenal di Bagian 13.3.1.
14.2 mod_php vs PHP-FPM: Perbedaan Model dan Kapan Masing-Masing Dipakai
PHP membutuhkan cara untuk terhubung ke web server sebelum bisa memproses request Visitor, dan ada dua model utama untuk itu, yaitu mod_php dan PHP-FPM. Memahami perbedaan arsitektur keduanya penting bagi Sysadmin, karena pilihan yang salah bisa berakhir pada masalah kompatibilitas yang membingungkan, terutama di server yang sudah memakai MPM event seperti hasil instalasi Apache di Bab 13.
14.2.1 mod_php: PHP Tertanam Langsung di Web Server
mod_php adalah module Apache, dipasang lewat paket seperti libapache2-mod-php, yang menanamkan interpreter PHP langsung ke dalam setiap proses worker Apache. Setiap kali Apache menerima request untuk file .php, proses worker itu sendiri yang menjalankan kode PHP-nya, tanpa perlu berkomunikasi ke proses lain. Model ini sederhana dan pernah menjadi standar de facto selama bertahun-tahun, tetapi punya kelemahan mendasar yaitu interpreter PHP tidak thread-safe, sehingga mod_php hanya bisa berjalan di atas MPM prefork yang memakai satu proses terpisah per koneksi, bukan MPM worker atau event yang memakai thread.
Konsekuensinya terasa langsung di server kita. Ubuntu Server memakai MPM event sebagai default sejak beberapa rilis terakhir, sesuai dengan yang sudah dibahas di Bagian 13.1. Cek kembali MPM yang aktif saat ini.
apache2ctl -M | grep mpmSelama output-nya menunjukkan mpm_event_module, memasang mod_php berarti memaksa Apache berpindah balik ke MPM prefork yang jauh lebih boros memori untuk beban traffic tinggi, sebuah trade-off yang jarang sepadan hanya demi menjalankan PHP. Inilah alasan utama mod_php semakin ditinggalkan di instalasi baru, meskipun masih banyak dijumpai di server lawas yang sudah berjalan lama tanpa pernah dimigrasi.
14.2.2 PHP-FPM: Process Manager yang Berdiri Sendiri
PHP-FPM (FastCGI Process Manager) mengambil pendekatan yang sama sekali berbeda. PHP-FPM berjalan sebagai service-nya sendiri, terpisah sepenuhnya dari proses web server, dan berkomunikasi dengan Nginx atau Apache lewat protokol FastCGI, baik melalui Unix socket seperti /run/php/php8.4-fpm.sock yang sudah kita lihat di Bagian 14.1.1, maupun lewat port TCP. Web server cukup meneruskan request untuk file .php ke socket tersebut, menunggu hasilnya, lalu mengirimkan balik ke Visitor persis seperti mekanisme reverse proxy yang sudah kita praktikkan di Bagian 12.3.2.
Karena berdiri sendiri, PHP-FPM sama sekali tidak peduli MPM apa yang dipakai Apache, dan bisa dipasangkan ke Nginx yang bahkan tidak punya konsep module PHP sama sekali. PHP-FPM juga mengatur worker process-nya sendiri lewat konsep pool, kumpulan proses PHP yang bisa diatur jumlah minimum, maksimum, dan strategi scaling-nya secara independen dari konfigurasi web server, serta memungkinkan beberapa versi PHP berjalan berdampingan di satu server yang sama, masing-masing dengan pool dan socket sendiri. Hal ini adalah sesuatu yang mustahil bagi mod_php, karena interpreter-nya menyatu langsung dengan proses Apache.
14.2.3 Tabel Perbandingan dan Rekomendasi Pemakaian
Di lapangan, PHP-FPM sudah menjadi pilihan standar untuk instalasi baru, termasuk dokumentasi resmi WordPress yang merekomendasikan Nginx dengan PHP-FPM sebagai salah satu stack yang disarankan. mod_php tetap relevan sebagai pengetahuan historis dan untuk kasus khusus server lawas bermuatan aplikasi yang sudah sangat bergantung pada perilakunya, tetapi bukan pilihan default untuk server yang dibangun dari nol.
| Aspek | mod_php | PHP-FPM |
|---|---|---|
| Lokasi eksekusi | Tertanam di dalam proses worker Apache | Proses/service terpisah, dihubungi lewat FastCGI |
| Kompatibilitas MPM/web server | Hanya MPM prefork, khusus Apache | Semua MPM Apache, juga Nginx dan web server lain |
| Multi-versi PHP | Sulit, satu interpreter per proses Apache | Mudah, tiap versi punya pool dan socket sendiri |
| Isolasi resource | Menyatu dengan resource Apache | Bisa diatur independen lewat konfigurasi pool |
| Status di lapangan saat ini | Legacy, dipertahankan untuk kompatibilitas lama | Standar de facto untuk instalasi baru |
Bagian selanjutnya mempraktikkan langsung cara menghubungkan PHP-FPM yang sudah terpasang, baik ke Nginx maupun ke Apache.
14.3 Menghubungkan PHP-FPM ke Nginx (FastCGI) dan ke Apache (proxy_fcgi)
PHP-FPM yang sudah aktif sejak Bagian 14.1 belum terhubung ke web server mana pun, sehingga request ke file .php masih belum bisa diproses. Bagian ini menghubungkan PHP-FPM tersebut ke Nginx lewat konfigurasi FastCGI bawaan, lalu ke Apache lewat module mod_proxy_fcgi, memakai ulang document root dan virtual host example.local yang sama persis dari Bab 12 dan Bab 13.
14.3.1 Menghubungkan PHP-FPM ke Nginx
Nginx sedang aktif melayani example.local sejak akhir Bab 13, sehingga bagian ini bisa langsung dipraktikkan tanpa mengubah service apa pun terlebih dahulu.
Langkah Praktik
- Buat file pengujian sederhana di document root
example.localyang sudah ada.echo "<?php phpinfo(); ?>" | sudo tee /var/www/example.local/html/info.php sudo chown www-data:www-data /var/www/example.local/html/info.php - Edit server block
example.local.sudo nano /etc/nginx/sites-available/example.local - Tambahkan
index.phpke directiveindexyang sudah ada, lalu tambahkan bloklocationbaru berikut di dalam blokserver.
Paketindex index.html index.php; location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php8.4-fpm.sock; }nginxdari repository Ubuntu sudah menyertakan file/etc/nginx/snippets/fastcgi-php.confsecara default. File ini berisi parameter FastCGI standar, termasukSCRIPT_FILENAMEyang memberi tahu PHP-FPM file.phpmana persisnya yang harus dijalankan, sehingga kita tidak perlu menulis ulang parameter-parameter tersebut secara manual di setiap server block. - Uji sintaks, lalu terapkan perubahan.
sudo nginx -t sudo systemctl reload nginx - Uji dari komputer lain di jaringan yang sama.
curl http://www.example.local/info.php
Respons yang muncul berupa halaman HTML panjang berisi detail konfigurasi PHP, tanda Nginx berhasil meneruskan request ke PHP-FPM dan menerima balik hasilnya. Perhatikan bahwa mengakses http://www.example.local/ tanpa embel-embel info.php tetap menampilkan index.html lama dari Bab 12, bukan otomatis mencari index.php, karena Nginx membaca directive index berurutan dari kiri ke kanan dan index.html masih lebih dulu ditemukan di document root.
Verifikasi dan Troubleshooting
- Munculnya error
502 Bad Gatewaydi sini punya arti berbeda dari502pada reverse proxy biasa di Bagian 12.3.2. Penyebabnya hampir selalu path socket yang salah ketik atau PHP-FPM yang belum aktif, bukan backend HTTP yang mati. Pastikan dengan perintah berikut:systemctl status php8.4-fpm.service ls -l /run/php/php8.4-fpm.sock - Jika error
File not found.justru muncul di dalam body response dan bukan sebagai halaman error Nginx biasa, hal tersebut umumnya berartifastcgi_passsudah benar tetapi PHP-FPM tidak menemukan file pada path yang diteruskan. Pastikanrootdi server block sama persis dengan document root tempat file PHP benar-benar disimpan. - Halaman
phpinfo()menampilkan banyak detail konfigurasi server, termasuk path internal dan versi software. Hapus atau nonaktifkan fileinfo.phpini di server production setelah selesai diuji, karena informasi tersebut sangat membantu Attacker memetakan celah yang bisa dieksploitasi.
14.3.2 Menghubungkan PHP-FPM ke Apache (proxy_fcgi)
Apache sedang tidak aktif sejak dimatikan di akhir Bab 13, sedangkan Nginx masih memakai port 80. Sama seperti pola di Bab 13, hentikan dulu Nginx sebelum mengaktifkan Apache untuk menghindari konflik port, lalu manfaatkan kembali virtual host example.local.conf yang sudah dibuat di Bagian 13.2.1.
Langkah Praktik
- Hentikan Nginx, lalu aktifkan kembali Apache.
sudo systemctl stop nginx sudo systemctl start apache2 - Aktifkan module
proxy_fcgidansetenvif, dua module yang dibutuhkan Apache untuk berbicara dengan PHP-FPM lewat FastCGI.sudo a2enmod proxy_fcgi setenvif - Paket
php8.4-fpmdi Ubuntu otomatis menyiapkan file konfigurasi integrasi untuk Apache begitu mendeteksiapache2sudah terpasang. Periksa keberadaannya.
Filels /etc/apache2/conf-available/ | grep phpphp8.4-fpm.confseharusnya sudah ada di sana, isinya kurang lebih seperti berikut.
Directive<FilesMatch \.php$> SetHandler "proxy:unix:/run/php/php8.4-fpm.sock|fcgi://localhost/" </FilesMatch>SetHandlerini yang menjadi inti penghubung. Setiap request untuk file berakhiran.phpditeruskan lewatmod_proxy_fcgike socket PHP-FPM yang sama persis dengan yang dipakai Nginx di Bagian 14.3.1, tanda kedua web server ini benar-benar berbagi satu mesin PHP yang sama di belakangnya. - Aktifkan konfigurasi tersebut.
sudo a2enconf php8.4-fpm - Restart Apache, karena mengaktifkan module baru mewajibkan restart penuh seperti yang sudah kita bahas di Bagian 13.3.1.
sudo apache2ctl configtest sudo systemctl restart apache2 - Uji dari komputer lain di jaringan yang sama.
curl http://www.example.local/info.php
Halaman phpinfo() yang muncul seharusnya identik dengan yang tadi disajikan Nginx, sebab keduanya benar-benar meneruskan request ke proses PHP-FPM yang sama, hanya jalur di depannya saja yang berbeda.
Verifikasi dan Troubleshooting
- Jika Apache masih mengunduh file
.phpmentah-mentah alih-alih menjalankannya, kemungkinan besara2enconf php8.4-fpmbelum dijalankan atau restart belum dilakukan setelahnya. Pastikan dengan perintah berikut:apache2ctl -M | grep proxy_fcgi - Jika di server yang sama pernah terpasang
libapache2-mod-phpdari percobaan lain, module tersebut bisa bentrok denganproxy_fcgikarena keduanya sama-sama mengklaim menangani file.php. Nonaktifkan lebih dulu dengansudo a2dismod php8.4sebelum mengaktifkanproxy_fcgi. - Kita bisa membuktikan kedua web server benar-benar berbagi PHP-FPM yang sama dengan membuat satu script kecil yang menampilkan SAPI yang sedang aktif.
Outputnya tetapecho '<?php echo php_sapi_name(); ?>' | sudo tee /var/www/example.local/html/sapi.php curl http://www.example.local/sapi.phpfpm-fcgibaik saat diakses lewat Nginx maupun Apache, bukanapache2handleryang justru muncul kalau memakaimod_php. Hal ini menjadi bukti nyata bahwa PHP-FPM sama sekali tidak terikat pada satu web server tertentu.
Kembalikan server ke kondisi baseline setelah pengujian ini selesai, mengikuti pola yang sama seperti penutup Bab 13, supaya Nginx tetap menjadi web server utama untuk bab-bab berikutnya.
sudo systemctl stop apache2
sudo systemctl disable apache2
sudo systemctl start nginx
curl http://www.example.local/info.phpPHP-FPM sendiri tidak perlu di-restart atau diubah apa pun saat berpindah dari Apache kembali ke Nginx, karena service tersebut memang berjalan independen dari web server mana pun yang sedang aktif, persis inti dari perbedaan arsitektur yang sudah dibahas di Bagian 14.2.2.
14.4 Konfigurasi php.ini Dasar dan Pengujian dengan Script PHP
PHP menyimpan sebagian besar pengaturan perilakunya di file php.ini, mulai dari batas memori sampai apakah pesan error boleh ditampilkan ke Visitor. Bagian ini mempraktikkan perubahan beberapa directive yang paling sering disesuaikan Sysadmin di lapangan, sekaligus menutup bab dengan pengujian akhir memakai script PHP yang lebih mencerminkan penggunaan nyata dibanding sekadar phpinfo().
14.4.1 Directive php.ini yang Paling Sering Disesuaikan
Ubuntu memisahkan file php.ini berdasarkan SAPI yang memakainya, bukan menyediakan satu file tunggal untuk semua konteks. Sejak instalasi di Bagian 14.1, hanya ada dua direktori yang relevan untuk kita, yaitu /etc/php/8.4/fpm/php.ini yang dipakai PHP-FPM saat melayani web, dan /etc/php/8.4/cli/php.ini yang dipakai saat PHP dijalankan lewat terminal. Mengubah salah satunya sama sekali tidak memengaruhi yang lain, sebuah sumber kebingungan umum saat sebuah pengaturan "sudah diubah" tetapi perilakunya tidak berubah di browser.
Langkah Praktik
- Edit
php.inimilik PHP-FPM, karena inilah yang benar-benar memengaruhi aplikasi web kita.sudo nano /etc/php/8.4/fpm/php.ini - Cari dan sesuaikan directive berikut sesuai kebutuhan.
Pengaturanmemory_limit = 256M upload_max_filesize = 20M post_max_size = 20M display_errors = Offmemory_limitmembatasi memori maksimum yang boleh dipakai satu script PHP, mencegah satu request bermasalah menghabiskan resource server. Parameterupload_max_filesizedanpost_max_sizeperlu dinaikkan bersamaan, karenapost_max_sizeyang lebih kecil dariupload_max_filesizeakan tetap menolak upload besar meskipun batas file individunya sudah dinaikkan. Pengaturandisplay_errorssebaiknya bernilaiOffdi server production, supaya pesan error PHP yang sering memuat path file dan versi software tidak langsung terlihat Visitor atau Attacker yang sedang mencari celah. - Restart PHP-FPM agar perubahan terbaca.
sudo systemctl restart php8.4-fpm - Verifikasi nilai yang benar-benar aktif lewat halaman
phpinfo()yang sudah dibuat di Bagian 14.3.1.curl -s http://www.example.local/info.php | grep -i memory_limit
Verifikasi dan Troubleshooting
- Apabila nilai yang tampil di
phpinfo()masih nilai lama, kemungkinan besar file yang diedit salah, misalnya tidak sengaja mengeditphp.inidi direktoriclialih-alihfpm, atau restart PHP-FPM belum dijalankan setelah perubahan. - Setelah
display_errorsdimatikan, error fatal pada script PHP hanya akan menampilkan halaman putih kosong tanpa pesan apa pun ke browser, dikenal luas sebagai White Screen of Death di kalangan Developer PHP. Jangan panik melihat halaman kosong ini, telusuri dulu error log PHP-FPM sebelum menyimpulkan ada yang rusak.sudo tail -n 20 /var/log/php8.4-fpm.log
14.4.2 Pengujian Akhir dengan Script PHP
Sebagai penutup, kita membuat satu script PHP kecil yang benar-benar memproses logika sederhana, bukan sekadar menampilkan informasi konfigurasi statis seperti phpinfo(), sekaligus memverifikasi bahwa semua lapisan yang sudah dibangun sepanjang bab ini benar-benar bekerja bersama.
Langkah Praktik
- Buat file
status.phpdi document rootexample.local.sudo nano /var/www/example.local/html/status.php - Isi dengan kode berikut.
<?php echo "<h1>PHP aktif di server ini</h1>"; echo "<p>Waktu server saat ini: " . date('Y-m-d H:i:s') . "</p>"; echo "<p>PHP SAPI yang menjalankan script ini: " . php_sapi_name() . "</p>"; echo "<p>Ekstensi mysqli terpasang: " . (extension_loaded('mysqli') ? 'Ya' : 'Tidak') . "</p>"; - Sebelum diakses lewat browser, periksa dulu sintaksnya langsung dari terminal lewat PHP CLI yang sudah dipasang di Bagian 14.1.1. Langkah ini merupakan kebiasaan yang baik untuk menangkap typo lebih awal sebelum sempat memengaruhi Visitor.
Output yang sehat menunjukkanphp -l /var/www/example.local/html/status.phpNo syntax errors detected. - Samakan kepemilikan filenya, lalu uji dari komputer lain di jaringan yang sama.
sudo chown www-data:www-data /var/www/example.local/html/status.php curl http://www.example.local/status.php
Verifikasi dan Troubleshooting
- Baris
date()pada output seharusnya menunjukkan waktu server saat ini. Jika jamnya meleset jauh dari waktu sebenarnya, ini bukan masalah PHP, melainkan tanda konfigurasi timezone atau sinkronisasi waktuchronydari Bab 11 yang perlu ditinjau ulang, sekaligus catatan bahwadate.timezonediphp.inijuga perlu diset eksplisit agar PHP tidak bergantung pada tebakan zona waktu sistem. - Baris
php_sapi_name()adalah cara paling cepat memverifikasi PHP-FPM benar-benar yang menangani request, bukan mekanisme lain. Nilainya harus tetapfpm-fcgi, konsisten dengan pengujian di Bagian 14.3.2.
14.5 Composer: Dependency Manager untuk PHP
PHP sendiri hanya menyediakan bahasa dan ekstensinya, sedangkan aplikasi nyata seperti Laravel hampir selalu bergantung pada puluhan hingga ratusan library pihak ketiga yang saling berhubungan. Mengunduh dan menyusun manual setiap library beserta versi dan dependency-nya masing-masing jelas tidak praktis, dan di sinilah Composer berperan sebagai dependency manager standar PHP, mirip peran APT di level sistem operasi yang sudah dibahas di Bab 6, hanya saja bekerja di level aplikasi dan per-project alih-alih per-server.
14.5.1 Instalasi Composer dari Installer Resmi
Ubuntu Server sebenarnya menyediakan paket composer lewat apt, tetapi versinya cenderung tertinggal beberapa rilis dari versi resmi terbaru karena mengikuti jadwal freeze repository Ubuntu, bukan jadwal rilis Composer sendiri. Dokumentasi Laravel dan sebagian besar framework modern mengasumsikan Composer versi terbaru, sehingga instalasi lewat installer script resmi dari getcomposer.org lebih dianjurkan dibanding paket apt untuk kebutuhan pengembangan aktif.
Langkah Praktik
- Unduh installer, lalu verifikasi checksum-nya lewat signature resmi sebelum dieksekusi. Langkah verifikasi ini penting karena installer pada dasarnya adalah script PHP yang dijalankan dengan hak akses Sysadmin.
Pesanphp -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" php -r "if (hash_file('sha384', 'composer-setup.php') === file_get_contents('https://composer.github.io/installer.sig')) { echo 'Installer terverifikasi'.PHP_EOL; } else { echo 'Installer korup, hapus dan ulangi'.PHP_EOL; unlink('composer-setup.php'); }"Installer terverifikasiharus muncul sebelum melanjutkan ke langkah berikutnya. Jika yang muncul justru pesan korup, ulangi proses unduh dari awal, jangan lanjutkan dengan file yang sudah terlanjur dihapus skrip di atas. - Jalankan installer untuk menghasilkan
composer.phar, lalu hapus file installer-nya karena sudah tidak diperlukan lagi.php composer-setup.php php -r "unlink('composer-setup.php');" - Pindahkan
composer.pharke/usr/local/binsupaya bisa dipanggil dari direktori mana pun sebagai perintah globalcomposer, mengikuti konvensi binary pihak ketiga yang sama seperti yang sudah kita praktikkan sebelumnya di server ini.sudo mv composer.phar /usr/local/bin/composer composer --version
Verifikasi dan Troubleshooting
- Jika perintah
composermenghasilkancommand not foundsetelah dipindahkan, pastikan/usr/local/binmemang termasuk dalamPATHuser yang sedang dipakai lewatecho $PATH. - Composer dapat memutakhirkan dirinya sendiri kapan saja tanpa perlu mengulang proses installer, cukup lewat
sudo composer self-update. - Paket
apt install composertetap menjadi pilihan sah untuk server yang mengutamakan konsistensi versi lewatunattended-upgradesdari Bab 6 dan tidak terlalu bergantung pada fitur Composer paling baru.
14.5.2 Menambah Dependency dan Autoloading Dasar
Bagian ini mempraktikkan alur kerja Composer yang paling umum dijumpai Sysadmin saat menyiapkan atau men-deploy aplikasi PHP, yaitu menambah dependency dan memanfaatkan autoloading kelasnya tanpa perlu include atau require manual satu per satu.
Langkah Praktik
- Buat direktori percobaan terpisah dari document root web server, supaya tidak tercampur dengan virtual host
example.localyang sudah dibangun di Bab 12 dan Bab 13.mkdir ~/demo-composer && cd ~/demo-composer - Tambahkan satu library populer sebagai contoh, yaitu
monolog/monologuntuk kebutuhan logging.
Perintah ini otomatis membuat tiga hal sekaligus:composer require monolog/monologcomposer.jsonyang mencatat dependency apa saja yang dibutuhkan project,composer.lockyang mengunci versi persis setiap dependency beserta turunannya agar instalasi ulang selalu menghasilkan versi yang identik, dan direktorivendor/tempat kode library beserta autoloader-nya benar-benar disimpan. - Buat script kecil yang memanfaatkan autoloading dari Composer, tanpa satu pun baris
requiremanual ke file library.
Isi dengan kode berikut.nano test.php<?php require 'vendor/autoload.php'; use Monolog\Logger; use Monolog\Handler\StreamHandler; $log = new Logger('demo'); $log->pushHandler(new StreamHandler('php://stdout')); $log->info('Composer berhasil memuat dependency lewat autoloading.'); - Jalankan lewat PHP CLI.
php test.php
Verifikasi dan Troubleshooting
- Output yang sehat menampilkan satu baris log berformat timestamp, nama channel
demo, levelINFO, dan pesan yang sudah ditulis, tanda classMonolog\Loggerberhasil dimuat otomatis olehvendor/autoload.phpmeskipun tidak pernah di-requiremanual. - Error
Failed opening required 'vendor/autoload.php'berarticomposer requireataucomposer installbelum pernah dijalankan di direktori tersebut, sehingga foldervendor/memang belum ada. - Saat memindahkan aplikasi PHP berbasis Composer ke server lain atau melakukan deployment, jalankan
composer install, bukancomposer update. Perintahinstallmembacacomposer.lockapa adanya dan menghasilkan environment yang identik, sedangkanupdatejustru mencari versi terbaru yang masih memenuhi batasan dicomposer.jsondan bisa diam-diam menaikkan versi dependency di server production. - Direktori
vendor/lazimnya tidak disertakan ke dalam repository Git karena ukurannya besar dan bisa dibuat ulang kapan saja lewatcomposer install. Yang wajib disertakan justrucomposer.jsondancomposer.lock, karena keduanya adalah sumber kebenaran dependency project.
Sampai di sini, PHP-FPM sudah terpasang lengkap dengan ekstensi umum, terhubung ke Nginx maupun Apache, siap menjalankan aplikasi PHP sungguhan dengan konfigurasi dasar yang wajar untuk kebutuhan web, dan dilengkapi Composer untuk mengelola dependency aplikasi modern seperti Laravel. Bab 15 melanjutkan topik reverse proxy yang sudah disinggung sejak Bab 12, kali ini untuk aplikasi backend yang lebih beragam dan load balancing antar beberapa backend sekaligus, sebelum Bab 16 menambahkan lapisan HTTPS lewat Let's Encrypt ke seluruh virtual host yang sudah kita bangun.

