Rumah utama PHP memang ada di web: halaman yang dikunjungi pengguna lewat browser. Untungnya, Anda tidak perlu memasang Apache atau Nginx sekadar mencicipi PHP di ranah web — setiap pemasangan PHP sudah menyertakan built-in web server yang dinyalakan dengan satu perintah. Pada Chapter ini kita nyalakan server itu, uji halaman PHP lewat curl, lalu berkenalan dengan konsep document root dan router script. Seluruh sesi pada chapter ini benar-benar dijalankan dan diamati pada PHP 8.4 di komputer lokal, lalu servernya dimatikan kembali.

Dari Terminal ke Browser #

Pada Chapter PHP Tags kita sudah melihat berkas PHP yang bercampur HTML. Di terminal, zone teks berkas itu keluar apa adanya; di web, zone teks itulah yang dikirim ke browser sebagai respons. Alurnya begini: browser mengirim permintaan HTTP ke server, server menemukan berkas .php yang diminta, PHP mengeksekusi berkas tersebut, dan hasil keluarannya — HTML utuh tanpa sisa kode PHP — dikirim kembali sebagai respons. Mari kita siapkan berkas yang akan disajikan; simpan sebagai halo.php di folder baru bernama web:

php
<?php
$nama = "Budi";
?>
<!DOCTYPE html>
<html>
<head>
    <title>Latihan Web Server</title>
</head>
<body>
    <h1>Halo, <?= $nama ?>!</h1>
    <p>Halaman ini disajikan oleh built-in web server PHP.</p>
</body>
</html>

Output yang Dihasilkan:

text
<!DOCTYPE html>
<html>
<head>
    <title>Latihan Web Server</title>
</head>
<body>
    <h1>Halo, Budi!</h1>
    <p>Halaman ini disajikan oleh built-in web server PHP.</p>
</body>
</html>

Menjalankan berkas itu lewat CLI memang mencetak HTML yang sama — dan itulah yang menjadikan contoh ini mudah diuji. Bedanya lewat web: HTML tersebut dikirim sebagai respons HTTP kepada browser, lengkap dengan status 200 OK, header Content-type: text/html; charset=UTF-8, dan header X-Powered-By yang menyebut versi PHP — tiga hal yang kami amati langsung saat menguji server ini dengan curl.

Menyalakan Server #

Dari dalam folder web, jalankan:

bash
php -S 127.0.0.1:8099

Terminal berhenti menampilkan prompt dan menampilkan baris seperti berikut, lalu diam menunggu permintaan:

text
PHP 8.4.23 Development Server (http://127.0.0.1:8099) started

Argumen pertama adalah alamat 127.0.0.1 — alamat loopback yang hanya bisa diakses dari komputer itu sendiri — dan 8099 adalah nomor port, pintu komunikasi yang dipilih bebas asalkan belum dipakai program lain. Karena perintah di atas dijalankan tanpa opsi tambahan, folder tempat Anda berdiri saat ini menjadi document root: folder akar tempat server mencari berkas yang diminta. Bila ingin menunjuk folder lain, pakai opsi -t:

bash
php -S 127.0.0.1:8099 -t /home/budi/web

Sambil server berjalan, buka terminal kedua lalu minta halaman dengan curl:

bash
curl http://127.0.0.1:8099/halo.php

Hasil pengujian kami: curl menerima HTML utuh — persis output blok halo.php di atas — dan di terminal tempat server berjalan, setiap permintaan tercatat satu baris log, misalnya 127.0.0.1:47944 [200]: GET /halo.php. Membuka alamat yang sama di browser memberikan halaman yang sudah jadi: judul halaman, sapaan besar Halo, Budi!, tanpa jejak kode PHP sedikit pun. Untuk menghentikan server, tekan Ctrl+C di terminal tempatnya berjalan; bila server ditinggalkan berjalan di latar belakang, perintah pkill -f "php -S" mengakhirinya.

Router Script #

Sampai di sini server hanya memetakan URL ke berkas satu-satu. Opsi lanjutannya adalah router script: berkas PHP yang Anda serahkan sebagai argument terakhir, dan setiap permintaan melewatinya lebih dulu. Router boleh menangani permintaan itu sendiri, atau mengembalikan false untuk menyuruh server menyajikan berkas secara biasa:

php
<?php

// router.php — mengatur berkas mana yang melayani permintaan.

$path = parse_url($_SERVER["REQUEST_URI"], PHP_URL_PATH);
$berkas = __DIR__ . $path;

if ($path !== "/" && file_exists($berkas)) {
    return false; // serahkan ke server: sajikan berkas apa adanya
}

if ($path === "/") {
    require __DIR__ . "/halo.php";
    return true;
}

http_response_code(404);
echo "Halaman tidak ditemukan: $path";

Jalankan dengan php -S 127.0.0.1:8099 router.php, lalu kami menguji tiga jenis permintaan dan hasilnya: alamat / disajikan oleh halo.php lewat require; alamat berkas statis seperti /gaya.css dilayani server langsung karena router mengembalikan false; dan alamat yang tidak ada seperti /tidak-ada jatuh ke baris terakhir, menghasilkan kode status 404 dengan pesan Halaman tidak ditemukan: /tidak-ada. Jangan berlarut pada function parse_url atau $_SERVER — keduanya dibahas di Section Superglobals dan Web Fundamentals. Yang perlu Anda bawa sekarang adalah polanya: router adalah satu titik kendali untuk seluruh URL, cikal bakal mekanisme routing yang Anda temui di framework modern.

Ringkasan #

Satu perintah php -S 127.0.0.1:8099 mengubah folder apa pun menjadi web server yang mengeksekusi PHP dan mengirim hasilnya sebagai respons HTTP. Document root — folder akar pencarian berkas — diatur lewat opsi -t, dan router script menambah satu titik kendali atas seluruh permintaan. Server ini menuntaskan siklus belajar web PHP di komputer lokal tanpa pemasangan tambahan apa pun. Sebelum menutup section ini, masih ada satu mode eksekusi yang belum kita coba: menguji kode baris demi baris secara interaktif.

Referensi #

Berkas Sumber

Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.

halo.php

Unduh berkas
php
<?php

// halo.php — halaman sederhana untuk menguji built-in web server.
// Uji lewat CLI : php halo.php
// Uji lewat web : php -S 127.0.0.1:8099 lalu buka http://127.0.0.1:8099/halo.php

$nama = "Budi";
?>
<!DOCTYPE html>
<html>
<head>
    <title>Latihan Web Server</title>
</head>
<body>
    <h1>Halo, <?= $nama ?>!</h1>
    <p>Halaman ini disajikan oleh built-in web server PHP.</p>
</body>
</html>