Setiap halaman web yang pernah Anda buat dengan PHP sebenarnya adalah hasil satu pertukaran pesan berformat baku antara dua program: browser Anda sebagai klien, dan server tempat skrip PHP berjalan. Aturan pertukaran pesan tersebut ditulis dalam sebuah protokol bernama HTTP (Hypertext Transfer Protocol). Pemahaman HTTP menentukan kualitas keputusan teknis Anda sebagai pengembang PHP, mulai dari membaca data form, merancang API, sampai men-debug respons yang tidak sesuai harapan. Pada chapter ini kita akan membedah model komunikasi klien-server, sifat stateless HTTP, wujud mentah pesan HTTP, peran HTTPS, dan evolusi versi protokolnya.

Apa Itu Protokol HTTP #

Protokol adalah kesepakatan tentang format pesan agar dua program yang berbeda dapat saling memahami. HTTP mendefinisikan bagaimana klien meminta sebuah sumber daya — halaman HTML, data JSON, gambar, berkas CSS — dan bagaimana server harus menjawab permintaan tersebut. Sejak versi 1.1, HTTP berbasis teks: satu pesan tersusun dari baris-baris pendek yang dapat Anda baca langsung di terminal, bukan blob biner yang harus didekode lebih dulu.

Klien HTTP tidak harus browser. Chrome dan Firefox adalah klien, tetapi alat baris perintah seperti curl, aplikasi mobile, dan bahkan skrip PHP Anda sendiri juga bertindak sebagai klien ketika memanggil API pihak lain. Di sisi lain ada server HTTP — Apache, Nginx, atau built-in web server PHP — yang mendengarkan permintaan masuk, menjalankan kode PHP, lalu mengirimkan jawaban kembali ke klien.

Model Komunikasi Klien-Server #

HTTP menganut model request-response: klien selalu memulai percakapan dengan mengirim satu request, server memprosesnya, lalu mengirim tepat satu response. Server tidak pernah mengirim data ke browser tanpa diminta lebih dulu. Pola satu-per-satu ini sederhana, tetapi hampir seluruh web bekerja di atasnya.

Diagram di atas merangkum siklus dasarnya: request berisi pesanan (halaman apa, data apa yang dikirim), dan response berisi hasil (konten, kode status, header). Skrip PHP Anda berada di kotak kanan — server side. Tugas skrip PHP adalah menerima request, mengolah data, dan menghasilkan response yang lengkap: isi halaman, header, serta kode status. Setelah response terkirim, pekerjaan skrip selesai; untuk request berikutnya, server menjalankan skrip dari awal lagi. Perilaku inilah yang membawa kita ke sifat terpenting HTTP berikutnya.

HTTP Bersifat Stateless #

HTTP bersifat stateless: setiap request ditangani secara independen, dan server tidak menyimpan ingatan apa pun tentang request sebelumnya. Dua request yang datang dari browser yang sama, satu detik saja berselang, diperlakukan seperti dua orang asing yang berbeda. Bagi pengembang PHP, konsekuensinya besar — variabel, koneksi data, dan hasil perhitungan dari request pertama tidak otomatis tersedia saat request kedua datang.

Kode berikut mensimulasikan tiga request yang datang berurutan ke skrip yang sama:

php
<?php
function tanganiPermintaan(int $nomor): void
{
    $jumlahKunjungan = 1;

    echo "Permintaan #$nomor: jumlahKunjungan = $jumlahKunjungan\n";
}

tanganiPermintaan(1);
tanganiPermintaan(2);
tanganiPermintaan(3);

Output yang Dihasilkan:

text
Permintaan #1: jumlahKunjungan = 1
Permintaan #2: jumlahKunjungan = 1
Permintaan #3: jumlahKunjungan = 1

Mari kita telaah simulasi di atas:

  1. Baris 2 (function tanganiPermintaan(...)): fungsi ini berperan sebagai penangan satu request HTTP. Isi fungsinya persis seperti isi sebuah berkas .php yang dijalankan server.
  2. Baris 4 ($jumlahKunjungan = 1;): setiap kali fungsi dipanggil, variabel lokal dibuat ulang dari nol. Tidak ada mekanisme di dalam fungsi yang bisa “mengingat” pemanggilan sebelumnya.
  3. Baris 9-11 (tiga pemanggilan): ketiga pemanggilan mewakili tiga request terpisah. Ketiganya mencetak nilai 1 — sama seperti server yang setiap request memulai keadaan kosong.

Lalu bagaimana website bisa “ingat” bahwa Anda sudah login, atau keranjang belanja bisa tersimpan antar halaman? Jawabannya: klien harus mengulang konteksnya pada setiap request, misalnya lewat cookie atau session yang identitasnya dikirim bersama tiap request. PHP menyediakan mekanisme $_SESSION dan setcookie() untuk keperluan ini, yang akan kita bahas tuntas pada section keamanan.

Melihat HTTP Mentah dari Terminal #

Teori akan jauh lebih mudah dicerna ketika Anda melihat HTTP yang sebenarnya. Siapkan sebuah berkas halo.php di sebuah folder kosong:

php
<?php
echo "Halo dari server PHP!";

Nyalakan built-in web server PHP pada folder tersebut — perintah berikut menempati terminal pertama dan terus berjalan:

bash
php -S 127.0.0.1:8099

Dari terminal kedua, minta halaman halo.php sambil menampilkan percakapan mentahnya:

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

curl -v (verbose) mencetak seluruh percakapan: baris berawalan > adalah request yang dikirim, baris berawalan < adalah response yang diterima. Berikut hasil pada penulis Chapter ini:

text
> GET /halo.php HTTP/1.1
> Host: 127.0.0.1:8099
> User-Agent: curl/8.14.1
> Accept: */*
>
< HTTP/1.1 200 OK
< Host: 127.0.0.1:8099
< Date: Tue, 13 Oct 2026 12:11:47 GMT
< Connection: close
< X-Powered-By: PHP/8.4.23
< Content-type: text/html; charset=UTF-8
<
Halo dari server PHP!

Ada beberapa hal penting yang bisa Anda baca dari transkrip di atas:

  1. Baris pertama request (GET /halo.php HTTP/1.1) disebut request line: berisi method (GET), path yang diminta (/halo.php), dan versi protokol.
  2. Tiga baris berikutnya adalah header request — Host wajib ada pada HTTP/1.1, User-Agent mengidentifikasi klien, dan Accept menyatakan jenis konten yang diterima.
  3. Baris > yang kosong menandai akhir bagian header; setelahnya seharusnya body request, dan GET tidak membawa body.
  4. Baris pertama response (HTTP/1.1 200 OK) adalah status line: versi protokol, kode status 200, dan alasan OK.
  5. Header response menyertakan Date (waktu response dibuat — nilai ini berbeda setiap kali Anda menjalankan perintah), informasi server PHP lewat X-Powered-By, serta Content-type yang ditetapkan otomatis untuk output PHP.
  6. Baris < yang kosong memisahkan header dari body, lalu body response berupa teks hasil echo di halo.php.

Karena HTTP berbasis teks, kita bisa membangun pesan request secara programatik dengan operasi string biasa. Fungsi berikut menyusun request GET lengkap sesuai aturan protokol:

php
<?php
function buatRequestMentah(string $method, string $host, string $path, array $headers = []): string
{
    $baris = [$method . " " . $path . " HTTP/1.1", "Host: " . $host];

    foreach ($headers as $nama => $nilai) {
        $baris[] = $nama . ": " . $nilai;
    }

    return implode("\r\n", $baris) . "\r\n\r\n";
}

$request = buatRequestMentah(
    "GET",
    "www.example.com",
    "/produk?halaman=2",
    ["User-Agent" => "kursus-php/1.0", "Accept" => "text/html"],
);

echo $request;
echo "--- akhir permintaan ---\n";

Output yang Dihasilkan:

text
GET /produk?halaman=2 HTTP/1.1
Host: www.example.com
User-Agent: kursus-php/1.0
Accept: text/html

--- akhir permintaan ---

Mari kita telaah cara kerjanya:

  1. Baris 3-12: fungsi menyusun baris pertama dari method, path, dan versi, menambahkan header Host, lalu menempel header tambahan dari parameter $headers.
  2. Baris 10 (implode("\r\n", ...)): setiap baris pesan HTTP diakhiri pasangan karakter carriage return + line feed (\r\n), bukan sekadar \n.
  3. Akhiran "\r\n\r\n": satu baris kosong — dua pasangan CRLF berturut-turut — menjadi pemisah resmi antara bagian header dan body. Inilah alasan munculnya baris kosong pada transkrip curl -v di atas.

HTTPS Menambah Lapisan Keamanan #

HTTP polos mengirim pesan sebagai teks biasa. Semua yang lewat jalur jaringan — kata sandi, cookie, nomor kartu — dapat dibaca siapa pun yang bisa menyadap paket data tersebut. HTTPS adalah HTTP yang dibungkus protokol TLS (Transport Layer Security): pesan tetap berformat HTTP, tetapi terenkripsi selama perjalanan.

AspekHTTPHTTPS
Skema URLhttp://https://
Port default80443
Isi paket jaringanteks polos, dapat disadapterenkripsi
Identitas servertidak diverifikasidiverifikasi lewat sertifikat TLS

Selain enkripsi, sertifikat TLS juga membuktikan identitas domain, sehingga klien tahu bahwa ia berbicara dengan server yang benar, bukan peniru. Dari sisi skrip PHP, hampir tidak ada perubahan: kode yang membaca $_GET atau mengirim header tetap sama; yang berbeda hanyalah web server yang kini menangani jabat tangan TLS. Laravel dan framework modern bahkan mengizinkan Anda memakai helper seperti secure_url() agar pengguna tetap dijaga pada jalur terenkripsi.

Evolusi Versi HTTP #

HTTP berkembang lebih dari tiga dekade tanpa mengubah cara berpikir dasarnya: tetap request-response. Tabel berikut merangkum versi-versi yang perlu Anda kenal:

VersiTahunPerubahan penting
HTTP/1.01996satu koneksi TCP per request, lalu ditutup
HTTP/1.11997koneksi persisten, header Host wajib, caching
HTTP/22015format biner, banyak request berbagi satu koneksi (multiplexing)
HTTP/32022berjalan di atas QUIC (UDP), koneksi lebih cepat di jaringan buruk

Sebagai penulis PHP, Anda hampir tidak perlu menyentuh perbedaan antar versi tersebut — web server dan SAPI yang menanganinya. Dua hal layak diingat: header Host menjadi wajib sejak HTTP/1.1 (karena satu alamat IP bisa melayani banyak domain), dan makin baru versinya, makin efisien koneksi untuk halaman yang memuat banyak aset.

Ringkasan #

HTTP adalah protokol request-response berbasis teks: klien meminta, server menjawab, lalu keduanya berpisah tanpa ingatan — sifat stateless yang membuat variabel PHP selalu mulai dari nol pada setiap request. Kita telah melihat wujud mentah percakapan HTTP lewat curl -v, memahami peran PHP sebagai penghasil response di sisi server, serta mengenal HTTPS sebagai lapisan enkripsi di atasnya. Wujud mentah tersebut masih menyimpan tiga komponen besar yang perlu dibedah satu per satu: request line, header, dan body. Pada chapter berikutnya kita bedah anatomi lengkap request dan response, termasuk cara membacanya langsung dari dalam skrip PHP.

Referensi #

Berkas Sumber

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

contoh.php

Unduh berkas
php
<?php
// contoh.php — rangkuman contoh Chapter "Memahami HTTP"
// Jalankan dengan: php contoh.php

function tanganiPermintaan(int $nomor): void
{
    // Simulasi satu request HTTP: variabel selalu mulai dari nol.
    $jumlahKunjungan = 1;

    echo "Permintaan #$nomor: jumlahKunjungan = $jumlahKunjungan\n";
}

function buatRequestMentah(string $method, string $host, string $path, array $headers = []): string
{
    $baris = [$method . " " . $path . " HTTP/1.1", "Host: " . $host];

    foreach ($headers as $nama => $nilai) {
        $baris[] = $nama . ": " . $nilai;
    }

    return implode("\r\n", $baris) . "\r\n\r\n";
}

echo "== Simulasi tiga permintaan (sifat stateless) ==\n";
tanganiPermintaan(1);
tanganiPermintaan(2);
tanganiPermintaan(3);

echo "\n== Pesan request HTTP mentah ==\n";
echo buatRequestMentah(
    "GET",
    "www.example.com",
    "/produk?halaman=2",
    ["User-Agent" => "kursus-php/1.0", "Accept" => "text/html"],
);
echo "-- akhir permintaan --\n";