Daur hidup request
Laravel bukan kotak ajaib. Setiap permintaan menempuh jalur yang sama dan bisa dilacak. Memahaminya sekarang membuat worker mode di Fase 8 masuk akal, bukan menakutkan.
Intisari
- Semua permintaan masuk lewat satu file:
public/index.php. Tidak ada file PHP lain yang boleh diakses publik. - Urutannya: autoload โ
bootstrap/app.phpโ service provider (registerlaluboot) โ middleware โ rute โ controller โ response. - Semua provider di-
registerdulu, baru semuanya di-boot. Ini alasan kenaparegistertidak boleh memakai layanan lain. - Di mode klasik (PHP-FPM), seluruh rangkaian ini diulang setiap permintaan lalu dibuang.
- Di worker mode, langkah bootstrap hanya sekali โ dan itulah sumber kecepatannya sekaligus sumber jebakannya.
Perjalanan satu permintaan
public/index.phpโ satu-satunya pintu. Web server mengarahkan semua URL ke sini.- Autoloader Composer dimuat, sehingga semua kelas bisa ditemukan.
bootstrap/app.phpmembangun instanceApplicationโ inilah service container.- Service provider di-
registerโ semuanya, satu per satu. Tahap ini hanya mendaftarkan cara membuat objek; belum ada yang dijalankan. - Service provider di-
bootโ sekarang seluruh layanan sudah terdaftar, jadi provider boleh saling memakai. - Middleware global dilewati: penanganan sesi, verifikasi CSRF, dan apa pun yang kamu tambahkan.
- Router mencocokkan metode HTTP + URI, menjalankan middleware milik rute itu.
- Controller berjalan, mengembalikan sesuatu.
- Nilai kembalian diubah jadi
Response, melewati middleware dalam urutan terbalik, lalu dikirim. - Terminate โ middleware yang punya method
terminate()dijalankan setelah respons sampai ke pengguna.
Kenapa register dan boot dipisah. Kalau provider A mencoba memakai layanan
milik provider B di dalam register, urutan pemuatan menentukan apakah kodemu jalan โ dan urutan itu
bisa berubah saat kamu menambah paket. Dengan pemisahan ini, boot dijamin berjalan saat semua
layanan sudah terdaftar. Aturannya sederhana: register hanya mengikat, boot
boleh memakai.
Sekali jalan, lalu dibuang
Di mode PHP tradisional (PHP-FPM atau php artisan serve), sepuluh langkah di atas dijalankan penuh
untuk setiap permintaan. Semua objek dibangun, semua provider di-boot, lalu seluruh memori proses
dibuang begitu respons terkirim.
| Mode klasik (PHP-FPM) | Worker mode (Fase 8) | |
|---|---|---|
| Langkah 1โ5 | Setiap permintaan | Sekali, saat proses menyala |
| Langkah 6โ9 | Setiap permintaan | Setiap permintaan |
| Kebocoran memori | Tidak mungkin bertahan | Menumpuk sampai worker di-restart |
| Variabel statis | Selalu bersih | Bertahan antar permintaan |
| Biaya bootstrap | Dibayar terus-menerus | Dibayar sekali |
Kolom kanan itu isi Fase 8 secara keseluruhan. Tabel ini sengaja diletakkan di awal supaya saat kita sampai ke FrankenPHP dan RoadRunner, yang berubah cuma satu hal โ dan kamu sudah tahu hal apa.
Melihatnya sendiri
// routes/web.php โ tempel sementara untuk mengintip urutannya
Route::get('/debug-lifecycle', function () {
return [
'providers_termuat' => count(app()->getLoadedProviders()),
'sudah_boot' => app()->isBooted(),
'environment' => app()->environment(),
'waktu_bootstrap' => round((microtime(true) - LARAVEL_START) * 1000, 2).' ms',
];
});
Konstanta LARAVEL_START didefinisikan di baris pertama public/index.php. Angka yang muncul
adalah biaya bootstrap yang di Fase 8 akan kita hapus hampir seluruhnya.
Yang paling sering disalahpahami: "Laravel lambat". Yang lambat biasanya bukan Laravel, melainkan fakta bahwa framework sebesar apa pun harus dibangun ulang tiap permintaan di model PHP klasik โ plus query N+1 yang belum ketahuan. Dua-duanya punya obat, dan dua-duanya ada di roadmap ini: Fase 2 untuk query, Fase 8 untuk bootstrap.
Latihan: pasang rute di atas, muat sepuluh kali, dan catat rentang waktu_bootstrap-nya.
Simpan angka itu. Di akhir Fase 8 kamu akan mengukur ulang hal yang sama dengan FrankenPHP dan membandingkannya
โ jauh lebih meyakinkan daripada membaca benchmark orang lain.
Rangkuman ini sengaja dipangkas ke bagian yang dipakai di roadmap. Buka sumber aslinya saat kamu butuh detail lengkap atau referensi parameter.