Baris pertama setiap response HTTP memuat tiga digit yang memberi tahu hasil akhir sebuah request: HTTP/1.1 200 OK, HTTP/1.1 404 Not Found, atau HTTP/1.1 500 Internal Server Error. Angka itu bernama status code dan merupakan bagian response yang paling cepat dibaca — oleh browser saat memutuskan render atau tidak, oleh klien API saat memutuskan sukses atau gagal, dan oleh monitor saat memutuskan memberi alarm. Pada chapter ini kita akan memetakan kelima keluarga status code, membedah kode yang paling sering muncul, lalu mengaturnya langsung dari skrip PHP.
Apa Itu Status Code #
Status code adalah ringkasan hasil request dalam satu angka tiga digit, dikirim sebagai bagian pertama response sebelum seluruh header dan body. Ketika skrip PHP Anda mengalami kegagalan mengambil data dari database, pilihan status 500 atau 404 atau 200 menentukan bagaimana seluruh ekosistem bereaksi: browser menampilkan halaman error bawaan, pustaka HTTP menolak mem-parsing body, dan sistem pemantauan menghitung insiden.
Karena status code tiba paling awal, status juga menjadi alat komunikasi yang paling murah. Klien tidak perlu membaca isi body untuk tahu bahwa resource sudah pindah (301), bahwa ia harus login lebih dulu (401), atau bahwa ia mengirim terlalu banyak request (429). Seluruh semantik ini terkodifikasi dalam lima keluarga angka.
Lima Keluarga Status Code #
| Keluarga | Nama | Arti |
|---|---|---|
1xx | Informatif | request diterima, proses masih berjalan |
2xx | Sukses | request diterima, dipahami, dan diproses berhasil |
3xx | Redirect | resource pindah atau butuh aksi lanjutan dari klien |
4xx | Kesalahan klien | ada yang salah pada sisi pengirim request |
5xx | Kesalahan server | server gagal memenuhi request yang seharusnya valid |
Aturan praktisnya mudah diingat: 4xx berarti “salahmu, klien”, 5xx berarti “salahku, server”, dan 2xx berarti “berhasil”. Keluarga 3xx selalu bekerja berpasangan dengan header Location yang memberi tahu tujuan pindah, sementara 1xx hampir tidak pernah Anda tulis manual dalam kode PHP sehari-hari.
Status Code yang Paling Sering Muncul #
Tabel berikut merangkum kode yang akan paling sering Anda kirim dan temui:
| Kode | Nama | Kapan dipakai |
|---|---|---|
200 | OK | request berhasil; status default response PHP |
201 | Created | resource baru berhasil dibuat, biasanya setelah POST |
204 | No Content | berhasil tetapi tidak ada body yang perlu dikirim, misalnya setelah DELETE |
301 | Moved Permanently | resource pindah selamanya; browser akan mengingat |
302 | Found | redirect sementara, misalnya ke halaman login |
304 | Not Modified | salinan cache klien masih valid, tidak perlu kirim body |
400 | Bad Request | format request salah — JSON rusak, parameter kurang |
401 | Unauthorized | klien belum terautentikasi; login dulu |
403 | Forbidden | klien terautentikasi tetapi tidak punya hak akses |
404 | Not Found | resource tidak ada (atau sengaja tidak dipertunjukkan) |
405 | Method Not Allowed | path ada tetapi method tidak didukung |
422 | Unprocessable Content | format benar tetapi validasi gagal |
429 | Too Many Requests | klien kena pembatasan laju (rate limit) |
500 | Internal Server Error | server mengalami kegagalan tak terduga |
503 | Service Unavailable | server sedang kelebihan beban atau maintenance |
Beberapa pasangan mudah tertukar perlu digarisbawahi. 401 berarti “saya tidak tahu Anda ini siapa” — masalah identitas; 403 berarti “saya tahu Anda siapa, tapi dilarang” — masalah hak akses. 404 menyatakan resource memang tidak ada, sedangkan 422 menyatakan request-nya terbaca tetapi isinya ditolak aturan bisnis (misalnya email tanpa tanda @). Untuk perpindahan, 301 membuat browser menimpan alamat baru secara permanen, sementara 302 hanya berlaku sekali jalan — karena itu redirect setelah login memakai 302.
Mengatur Status Code dengan http_response_code #
PHP menyediakan fungsi http_response_code() yang bisa berperan sebagai pembaca sekaligus pengatur status. Dipanggil tanpa argumen, fungsi ini mengembalikan kode yang sedang terpasang. Mari kita periksa kondisi awalnya:
<?php
var_dump(http_response_code());Output yang Dihasilkan:
bool(false)Hasil bool(false) menunjukkan bahwa belum ada kode status yang terpasang — pada CLI, PHP memang belum mengirim response ke mana pun, jadi tidak ada angka yang bisa dilaporkan. Pada SAPI web, server otomatis memasang 200 OK ketika response mulai dikirim, sehingga skrip yang tidak mengatur apa pun akan menjawab 200. Sekarang kita pasang kode secara eksplisit sebelum ada output:
<?php
http_response_code(404);
echo "Kode status saat ini: " . http_response_code() . "\n";Output yang Dihasilkan:
Kode status saat ini: 404Baris pertama memasang status 404 ke response yang sedang disusun, dan baris berikutnya membacanya kembali tanpa argumen — hasilnya 404, bukan lagi false. Urutannya penting: setter harus dipanggil sebelum output pertama keluar, mengikuti aturan yang sama dengan header() karena baris status dan header dikirim bersama di awal pesan. Bila Anda memanggil setter setelah echo, PHP menolak dengan Warning: Cannot set response code - headers already sent dan kode tidak berubah.
Logika “keluarga mana angka ini?” juga mudah ditulis dalam kode, misalnya untuk kebutuhan logging atau tampilan pesan ringkas:
<?php
function pesanStatus(int $kode): string
{
return match (true) {
$kode >= 200 && $kode < 300 => "Sukses",
$kode >= 300 && $kode < 400 => "Redirect",
$kode >= 400 && $kode < 500 => "Kesalahan klien",
$kode >= 500 && $kode < 600 => "Kesalahan server",
default => "Informatif",
};
}
foreach ([200, 301, 404, 422, 503] as $kode) {
echo "$kode: " . pesanStatus($kode) . "\n";
}Output yang Dihasilkan:
200: Sukses
301: Redirect
404: Kesalahan klien
422: Kesalahan klien
503: Kesalahan serverEkspresi match (true) mengevaluasi setiap kondisi dari atas ke bawah dan mengembalikan arm pertama yang cocok — pola yang sudah kita kenal dari Section Dasar Pemrograman PHP. Rentang 200-299 diuji dengan $kode >= 200 && $kode < 300, dan arm default menampung 1xx yang jarang muncul. Fungsi kecil semacam ini berguna saat Anda meringkas health check atau mengelompokkan log akses.
Kesalahan Umum Status 200 untuk Error #
Kebiasaan paling berbahaya bagi pemula adalah menjawab 200 OK untuk segala hal, lalu menuliskan pesan kegagalan di dalam body. Dua versi fungsi berikut memperlihatkan bedanya:
<?php
function cariPenggunaSalah(int $id): array
{
if ($id !== 7) {
return ["status" => 200, "body" => "Pengguna tidak ditemukan"];
}
return ["status" => 200, "body" => "Budi Santoso"];
}
function cariPenggunaBenar(int $id): array
{
if ($id !== 7) {
return ["status" => 404, "body" => "Pengguna tidak ditemukan"];
}
return ["status" => 200, "body" => "Budi Santoso"];
}
$salah = cariPenggunaSalah(9);
$benar = cariPenggunaBenar(9);
echo "Versi kurang tepat: status {$salah['status']}, body: {$salah['body']}\n";
echo "Versi benar: status {$benar['status']}, body: {$benar['body']}\n";Output yang Dihasilkan:
Versi kurang tepat: status 200, body: Pengguna tidak ditemukan
Versi benar: status 404, body: Pengguna tidak ditemukanKedua fungsi mengembalikan body yang sama persis untuk kasus gagal, tetapi hanya cariPenggunaBenar() yang jujur lewat status. Versi pertama membuat pemanggil harus mem-parsing isi body hanya untuk mengetahui keberhasilan — dan sekali ada satu klien yang lupa mengecek, kegagalan menjadi tak terlihat: monitoring tidak menghitungnya, statistik keberhasilan API menjadi bohong, dan pustaka HTTP yang mengecek status otomatis (misalnya pustaka retry) justru mengulang request gagal karena mengiranya sukses.
Ringkasan #
Status code adalah ringkasan hasil request yang tiba paling awal: 1xx informatif, 2xx sukses, 3xx redirect, 4xx kesalahan klien, dan 5xx kesalahan server. Fungsi http_response_code() mengatur dan membaca kode tersebut, dengan satu syarat: pengaturan harus terjadi sebelum output pertama. Kode yang jujur — 404 untuk data hilang, 401 untuk belum login, 422 untuk validasi gagal — membuat seluruh ekosistem di sekitar API Anda bekerja benar. Baris status dan header dikirim sebagai satu paket di awal response; cara mengisi bagian header itulah yang menjadi fokus chapter berikutnya.
Referensi #
Berkas Sumber
Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.
contoh.php
Unduh berkas<?php
// contoh.php — rangkuman contoh Chapter "HTTP Status Codes"
// Jalankan dengan: php contoh.php
function pesanStatus(int $kode): string
{
return match (true) {
$kode >= 200 && $kode < 300 => "Sukses",
$kode >= 300 && $kode < 400 => "Redirect",
$kode >= 400 && $kode < 500 => "Kesalahan klien",
$kode >= 500 && $kode < 600 => "Kesalahan server",
default => "Informatif",
};
}
function cariPenggunaSalah(int $id): array
{
if ($id !== 7) {
return ["status" => 200, "body" => "Pengguna tidak ditemukan"];
}
return ["status" => 200, "body" => "Budi Santoso"];
}
function cariPenggunaBenar(int $id): array
{
if ($id !== 7) {
return ["status" => 404, "body" => "Pengguna tidak ditemukan"];
}
return ["status" => 200, "body" => "Budi Santoso"];
}
// Semua pemeriksaan dan pemasangan status dilakukan sebelum output apa pun,
// sesuai aturan "header sebelum output" pada chapter Headers.
$belumDiatur = http_response_code();
http_response_code(404);
$kodeTerpasang = http_response_code();
echo "== Kode status belum diatur ==\n";
var_dump($belumDiatur);
echo "\n== Pasang lalu baca ==\n";
echo "Kode status saat ini: $kodeTerpasang\n";
echo "\n== Keluarga status ==\n";
foreach ([200, 301, 404, 422, 503] as $kode) {
echo "$kode: " . pesanStatus($kode) . "\n";
}
echo "\n== Status 200 untuk error ==\n";
$salah = cariPenggunaSalah(9);
$benar = cariPenggunaBenar(9);
echo "Versi kurang tepat: status {$salah['status']}, body: {$salah['body']}\n";
echo "Versi benar: status {$benar['status']}, body: {$benar['body']}\n";