Panduan Desain Zero-Downtime Deployment Menggunakan Symlink dan OPcache Reset
Teknik pembaruan aplikasi web produksi secara mulus tanpa mengorbankan sesi pengguna yang sedang aktif bertransaksi.
Menyalin file kode baru langsung ke folder produksi adalah resep bencana bagi aplikasi dengan trafik konstan. Pengunjung dapat menerima galat ketika sebuah file dieksekusi sementara file lain yang berkaitan belum selesai tersalin.
Mengapa penyalinan bertahap selalu berisiko
Masalahnya bukan lamanya penyalinan, melainkan tidak adanya keadaan konsisten selama proses berlangsung. Selama beberapa detik, aplikasi berjalan dengan campuran kode lama dan baru — kelas yang mengharapkan tanda tangan metode versi baru bertemu implementasi versi lama.
Pola rilis bertanggal yang dihubungkan melalui symlink menghapus jendela tersebut. Seluruh versi baru disiapkan lengkap di direktori terpisah, dan pergantiannya dilakukan dengan satu operasi pemindahan symlink yang bersifat atomik pada tingkat sistem berkas.
OPcache dan jebakan realpath
Setelah symlink berpindah, PHP masih menyimpan byte-code versi lama di OPcache. Yang lebih menyulitkan, PHP juga menyimpan cache pemetaan jalur — realpath cache — sehingga proses lama tetap menunjuk ke direktori rilis sebelumnya meski symlink sudah berubah.
Membersihkan OPcache saja sering tidak cukup. Cara yang paling andal adalah memuat ulang PHP-FPM dengan sinyal reload yang membiarkan permintaan berjalan selesai lebih dulu sebelum worker diganti. Jika akses reload tidak tersedia, gunakan jalur absolut pada direktori rilis alih-alih melewati symlink.
Bagian yang tidak atomik
Symlink menyelesaikan persoalan kode, bukan persoalan basis data. Migrasi skema tidak dapat dibalik dalam sekejap, dan inilah bagian yang benar-benar menentukan apakah rollback mungkin dilakukan.
Aturannya: pisahkan perubahan skema menjadi langkah-langkah yang aman bagi dua versi kode sekaligus. Tambahkan kolom baru lebih dulu, biarkan kode lama dan baru sama-sama berjalan, dan hapus kolom lama hanya setelah versi lama benar-benar ditinggalkan. Penghapusan kolom pada rilis yang sama dengan kode yang memakainya membuat rollback mustahil.
Yang perlu diuji sebelum dibutuhkan
Rollback yang tidak pernah dicoba bukanlah rollback, melainkan harapan. Menjalankannya sekali di lingkungan pementasan mengungkap hal-hal yang tidak terpikirkan — cache yang menyimpan struktur lama, file sesi yang tidak kompatibel, aset terkompilasi yang hilang.
Menyimpan beberapa rilis terakhir dan menyediakan perintah satu baris untuk kembali memberi ketenangan yang sesungguhnya: bukan keyakinan bahwa rilis tidak akan gagal, melainkan kepastian bahwa kegagalan dapat dipulihkan dalam hitungan detik.
Budi Santoso
Kontributor RedaksiSenior Software Architect dan pemerhati ekosistem PHP, cloud computing, dan performa web skala besar.
Artikel Terkait
Lihat Semua →WebAssembly di Luar Peramban: Sandbox Ringan untuk Komputasi Tepi dan Plugin
20 Sep 2026
Arsitektur Append-Only Ledger: Rahasia Integritas Finansial Sistem Pembayaran Modern
31 Agt 2026
Evolusi Arsitektur Laravel 12: Optimalisasi Eksekusi PHP 8.4 dan Manajemen State
23 Agt 2026
Anatomi AI Image Generation: Dari Difusi Piksel Menuju Flow Matching
17 Okt 2026