Apache bukan satu-satunya jalan menjalankan PHP. Ada server bawaan PHP, PHP-FPM dengan Nginx, sampai FrankenPHP yang berjalan sebagai proses tunggal.
Apache masih jadi cara paling umum menjalankan PHP, tetapi bukan satu-satunya. Kamu bisa memakai server bawaan PHP untuk development, PHP-FPM di belakang Nginx untuk produksi, atau FrankenPHP yang menjalankan aplikasi sebagai proses tunggal. Pilihanmu bergantung pada apakah kamu butuh kecepatan setup, kontrol penuh atas konfigurasi, atau performa di bawah beban tinggi.
Berikut tujuh cara menjalankan PHP tanpa Apache, diurutkan dari yang paling ringan sampai yang paling cocok untuk produksi.
1. Server Bawaan PHP (php -S)
Sejak PHP 5.4, binary php sudah punya web server sendiri. Jalankan satu perintah di terminal:
php -S localhost:8000
Server ini melayani file dari direktori tempat kamu menjalankannya. Untuk development harian, cara ini menghilangkan kebutuhan memasang dan mengonfigurasi Apache.
Kelemahan yang perlu diketahui
Server bawaan PHP memproses satu permintaan dalam satu waktu. Kalau halamanmu memanggil API eksternal selama dua detik, permintaan lain menunggu. Pada halaman statis atau aplikasi sederhana, ini tidak terasa. Untuk menguji perilaku aplikasi di bawah beban bersamaan, kamu butuh server lain.
Untuk debugging selama development, kamu masih perlu alat tambahan. Perbandingan antara var_dump, Xdebug, dan logger dibahas di perbandingan cara debug PHP.
2. PHP Built-in Server dengan Router Script
Server bawaan PHP bisa dipakai untuk aplikasi dengan single entry point, misalnya framework yang mengarahkan semua request ke index.php. Buat file router:
<?php
$path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
$file = __DIR__ . $path;
if ($path !== '/' && file_exists($file) && !is_dir($file)) {
return false;
}
require __DIR__ . '/index.php';
Jalankan dengan php -S localhost:8000 router.php. Nilai balik false memberi tahu server agar menyajikan file statis langsung, sedangkan sisanya diteruskan ke aplikasi. Router script juga berguna untuk menyimulasikan URL rewrite seperti di Nginx atau Apache.
3. PHP-FPM sebagai Proses Terpisah
PHP-FPM (FastCGI Process Manager) menjalankan PHP sebagai layanan yang mendengarkan soket. Ia tidak melayani HTTP sendiri, jadi butuh web server di depannya. Keunggulannya: proses PHP terpisah dari web server, sehingga kamu bisa mengatur jumlah worker, membatasi memori, dan me-restart PHP tanpa mematikan server web.
Konfigurasi dasar di /etc/php/8.3/fpm/pool.d/www.conf mengatur pm.max_children, pm.start_servers, dan pm.max_requests. Nilai ini menentukan berapa banyak permintaan yang bisa diproses bersamaan sebelum worker didaur ulang.
4. Nginx dengan PHP-FPM
Pasangan Nginx dan PHP-FPM populer karena Nginx menangani koneksi lambat dan file statis dengan efisien, sementara PHP-FPM fokus mengeksekusi kode. Blok lokasi untuk PHP terlihat seperti ini:
location ~ .php$ {
include fastcgi_params;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
Perhatikan fastcgi_param SCRIPT_FILENAME. Kalau baris ini salah, Nginx akan mengembalikan File not found meski file PHP-nya ada. Kesalahan ini sering muncul saat memindahkan konfigurasi dari server lain karena path dokument root berbeda.
Kelemahan kombinasi ini: dua layanan harus dijaga, dua file konfigurasi harus diselaraskan, dan log tersebar di dua tempat. Kalau kamu mencari kesederhanaan, pilihan lain di daftar ini lebih masuk akal.
5. FrankenPHP
FrankenPHP membungkus runtime PHP ke dalam satu binary berbasis Caddy. Satu proses menangani HTTP, HTTPS otomatis lewat Let’s Encrypt, dan eksekusi PHP.
frankenphp php-server --root public/
Mode worker membuat aplikasi tetap hidup di memori antar permintaan. Framework seperti Laravel dan Symfony bisa memanfaatkannya untuk melewati proses bootstrap berulang. Hasilnya latensi lebih rendah pada aplikasi besar, dengan catatan kamu harus memastikan kode tidak menyimpan state yang bocor antar request.
6. Container Docker dengan PHP-FPM
Menjalankan PHP di dalam container memisahkan lingkungan dari mesin host. Kamu memilih image resmi, menyalin kode, lalu menjalankan PHP-FPM atau server bawaan di dalamnya.
FROM php:8.3-fpm
COPY . /var/www/html
WORKDIR /var/www/html
RUN docker-php-ext-install pdo_mysql
Pendekatan ini menghilangkan masalah “di laptop saya jalan, di server tidak”. Setiap anggota tim memakai versi PHP dan ekstensi yang sama. Biaya yang kamu tanggung adalah waktu build dan ukuran image yang lebih besar.
Kalau aplikasimu butuh kredensial database atau kunci API, simpan di file .env yang disuntikkan saat runtime. Beberapa pola penyimpanan konfigurasi dibahas di cara menyimpan konfigurasi database di PHP.
7. RoadRunner atau Swoole
RoadRunner dan Swoole menjalankan PHP sebagai proses yang bertahan lama, mirip FrankenPHP dalam mode worker. Bedanya, keduanya lebih dulu hadir dan sudah dipakai di aplikasi berskala besar sebelum FrankenPHP muncul.
RoadRunner ditulis dalam Go dan berkomunikasi dengan worker PHP lewat protokol Goridge. Swoole berbentuk ekstensi PHP yang menyediakan korutin dan server HTTP langsung di dalam proses PHP. Keduanya menuntut disiplin kode: variabel global dan koneksi database tidak boleh dipakai ulang sembarangan antar request, karena prosesnya tidak di-reset setiap kali ada permintaan baru.
Ringkasan perbandingan
| Pilihan | Cocok untuk | Yang perlu dijaga |
|---|---|---|
| Server bawaan PHP | Development cepat | Hanya satu request sekaligus |
| PHP-FPM | Produksi bersama Nginx | Dua layanan dan dua konfigurasi |
| FrankenPHP | Produksi dengan setup ringkas | Kebersihan state di mode worker |
| Docker | Konsistensi antar tim | Waktu build dan ukuran image |
| RoadRunner/Swoole | Beban tinggi | Manajemen memori jangka panjang |
Pertanyaan yang Sering Diajukan
Apakah server bawaan PHP aman dipakai di server publik?
Tidak. Server bawaan dirancang untuk development, bukan untuk melayani lalu lintas publik. Ia memproses satu permintaan dalam satu waktu dan tidak memiliki pengamanan yang biasanya disediakan web server produksi. Pakailah PHP-FPM, FrankenPHP, atau Nginx untuk aplikasi yang bisa diakses publik.
Bisakah berpindah dari Apache tanpa mengubah kode PHP?
Untuk sebagian besar kode, bisa. Yang biasanya perlu disesuaikan adalah aturan rewrite dan pembacaan header. Jika kode PHP-mu bergantung pada variabel server yang hanya disediakan Apache, seperti hasil mod_rewrite tertentu, kamu perlu menyesuaikannya agar bekerja dengan Nginx atau FrankenPHP.
Mana yang paling cepat untuk aplikasi kecil?
Perbedaan kecepatan antar pilihan ini sering kalah penting dibanding waktu yang dihabiskan untuk query database yang tidak dioptimalkan. Untuk aplikasi kecil, pilih yang paling sedikit merepotkan saat kamu deploy. Server bawaan PHP untuk lokal, dan FrankenPHP atau PHP-FPM dengan Nginx untuk produksi.