
Dalam proses optimasi performa website, salah satu aspek paling penting adalah caching. Banyak developer sering bertanya: apakah file gambar yang dimuat berasal dari cache browser ๐ฅ๏ธ, dari Cloudflare โ๏ธ, atau justru selalu diminta ulang ke server?
Artikel ini membahas secara mendalam cara kerja cache, cara mengeceknya di Chrome, serta bagaimana mengatur header cache di PHP agar optimal dan aman untuk production.
๐ง 1. Memahami Dua Jenis Cache: Browser vs CDN
๐ฅ๏ธ A. Browser Cache
Browser cache adalah file yang disimpan langsung di perangkat pengguna. Jika gambar sudah tersimpan dan belum melewati waktu kadaluarsa (max-age), browser tidak akan meminta ulang file ke server.
Ciri khas di Chrome DevTools:
Status Code: 200 (from disk cache)Status Code: 200 (from memory cache)
Artinya file diambil langsung dari penyimpanan lokal browser. โก
โ๏ธ B. Cloudflare Cache (CDN Cache)
Cloudflare adalah CDN (Content Delivery Network) yang menyimpan file statis di edge server mereka. Jika file tersedia di edge terdekat, maka request tidak sampai ke origin server.
Ciri khas di Response Headers:
cf-cache-status: HITโ → file diambil dari cache Cloudflarecf-cache-status: MISSโ → belum ada di cachecf-cache-status: EXPIREDโณ → kadaluarsacf-cache-status: BYPASS๐ซ → tidak di-cacheserver: cloudflare๐ → request melewati Cloudflare
๐ 2. Cara Mengecek Cache di Chrome
- Buka halaman website
- Klik kanan → Inspect
- Pilih tab Network
- Filter berdasarkan Img
- Klik salah satu gambar
- Buka tab Headers
Di bagian Response Headers, perhatikan:
- Apakah ada
cf-cache-status? โ๏ธ - Apakah ada
Cache-Control? ๐ฆ - Status Code menunjukkan
from disk cache? ๐พ
Untuk memastikan bukan cache browser, lakukan Hard Reload:
- Windows:
Ctrl + Shift + R - Mac:
Cmd + Shift + R
โ๏ธ 3. Mengatur Header Cache di PHP
Contoh implementasi:
$expire_seconds = 604800; // 7 hari
header("Cache-Control: public, max-age={$expire_seconds}, must-revalidate, proxy-revalidate, immutable");
header("Pragma: public");
header("Expires: " . gmdate("D, d M Y H:i:s", time() + $expire_seconds) . " GMT"); ๐ Penjelasan Directive
- public → Boleh di-cache oleh browser dan CDN
- max-age → Masa berlaku cache (dalam detik)
- must-revalidate → Harus validasi ulang setelah expire
- proxy-revalidate → Sama seperti must-revalidate untuk proxy/CDN
- immutable → Selama belum expire, browser tidak akan cek ulang meskipun refresh ๐
๐ 4. Kapan Menggunakan Immutable?
Gunakan immutable hanya jika file memiliki versi unik, misalnya:
image.abc123.jpgapp.js?v=20260301
Jika file tidak menggunakan versioning, penggunaan immutable bisa menyebabkan user tidak mendapatkan update terbaru hingga masa cache habis. โ ๏ธ
โ 5. Mengapa Cloudflare Kadang Tidak Cache?
Beberapa penyebab umum:
- Header
Cache-Control: private๐ซ - Ada cookie atau session aktif ๐ช
- Ada header Authorization ๐
- Rule Cloudflare tidak aktif โ๏ธ
- File dianggap dynamic ๐
Pastikan juga tidak ada konfigurasi NGINX atau Apache yang menimpa header dari PHP.
๐ 6. Best Practice untuk Production
๐ Untuk File Upload Dinamis
header("Cache-Control: public, max-age=604800"); Gunakan max-age sederhana tanpa must-revalidate dan immutable. Lebih stabil dan aman untuk file yang bisa berubah.
๐ฆ Untuk File Static Versioned (CSS/JS/Image Build)
header("Cache-Control: public, max-age=31536000, immutable"); Set 1 tahun + immutable, pastikan file menggunakan hash versioning.
๐งช 7. Validasi Menggunakan Curl
curl -I https://domain.com/path/image.jpg Perhatikan apakah muncul:
cf-cache-status: HIT Jika muncul HIT, berarti file benar-benar disajikan dari Cloudflare. ๐ฏ
๐ฏ Kesimpulan
Caching adalah kombinasi dari:
- Konfigurasi server (NGINX/Apache/PHP) ๐ฅ๏ธ
- Header HTTP yang benar ๐ก
- Konfigurasi CDN (Cloudflare) โ๏ธ
- Strategi versioning file ๐ข
Dengan memahami cara kerja browser cache dan CDN cache, developer dapat:
- Meningkatkan performa website secara signifikan โก
- Mengurangi beban server ๐ช
- Mengontrol update asset dengan lebih presisi ๐๏ธ
- Menghindari bug akibat cache lama ๐
Optimasi cache yang tepat bukan hanya soal kecepatan, tetapi juga tentang arsitektur sistem yang matang, scalable, dan profesional. ๐จ๐ปโจ
