Laravel Session dengan Redis: Cara Konfigurasi dan Menggunakannya
Apa Itu Laravel Session?
Session pada Laravel digunakan untuk menyimpan informasi sementara yang berkaitan dengan user selama beberapa request.
Contohnya:
- Status login user
- Flash message
- Data sementara dari form
- Preferensi user
- Informasi tertentu selama proses request
Contoh menyimpan data ke session:
session(['username' => 'Budi']);
Kemudian mengambilnya:
$username = session('username');
Laravel menyediakan beberapa session driver. Salah satunya adalah Redis.
Dengan Redis sebagai session store, data session disimpan pada Redis sehingga dapat diakses dengan cepat dan dapat digunakan oleh beberapa instance aplikasi Laravel.
Kenapa Menggunakan Redis untuk Laravel Session?
Pada aplikasi sederhana, session berbasis file mungkin sudah cukup.
Namun, ketika aplikasi berkembang dan menggunakan beberapa server, session berbasis file dapat menjadi kurang praktis.
Contohnya:
Load Balancer
│
┌───────┴───────┐
↓ ↓
Laravel 1 Laravel 2
│ │
Session Session
File File
Jika request pertama masuk ke Server 1 dan request berikutnya masuk ke Server 2, penyimpanan session lokal dapat menjadi masalah jika kedua server tidak menggunakan storage session yang sama.
Dengan Redis:
Load Balancer
│
┌───────┴───────┐
↓ ↓
Laravel 1 Laravel 2
│ │
└───────┬───────┘
↓
Redis
Session Store
Kedua server dapat menggunakan Redis yang sama sebagai penyimpanan session.
Ini membuat Redis sangat berguna untuk aplikasi Laravel yang berjalan pada beberapa server atau instance.
Laravel Session Driver
Laravel mendukung beberapa session driver, tergantung versi Laravel yang digunakan.
Driver yang umum antara lain:
filedatabaseredismemcachedarray- Driver lain yang tersedia pada versi atau package yang digunakan
Konfigurasi session dapat ditemukan pada:
config/session.php
Pada versi Laravel tertentu, environment variable yang digunakan untuk menentukan driver adalah:
SESSION_DRIVER=redis
Pada versi Laravel yang lebih baru, kamu dapat menemukan:
SESSION_DRIVER=database
atau driver lain sebagai default.
Karena struktur konfigurasi dapat berubah antarversi Laravel, selalu periksa config/session.php pada project yang digunakan.
Cara Mengubah Laravel Session ke Redis
Jika Redis sudah terpasang dan dapat digunakan oleh Laravel, ubah konfigurasi .env:
SESSION_DRIVER=redis
Kemudian pastikan konfigurasi Redis tersedia:
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
Jika Redis berada pada server yang sama dengan Laravel, 127.0.0.1 biasanya dapat digunakan.
Jika Redis berada pada server berbeda, gunakan hostname atau alamat jaringan Redis sesuai konfigurasi infrastructure.
Jangan membuka Redis secara langsung ke internet publik.
Konfigurasi Session Redis di Laravel
Periksa file:
config/session.php
Pada konfigurasi Laravel, bagian session dapat terlihat seperti:
'driver' => env('SESSION_DRIVER', 'database'),
Sedangkan konfigurasi Redis berada pada:
config/database.php
Laravel kemudian menggunakan Redis connection yang dikonfigurasi untuk aplikasi.
Pada beberapa versi Laravel, session Redis dapat menggunakan connection tertentu melalui konfigurasi session.
Contohnya:
'connection' => env('SESSION_CONNECTION'),
Jika project menggunakan konfigurasi seperti ini, periksa nilai SESSION_CONNECTION pada .env.
Misalnya:
SESSION_CONNECTION=default
Nama connection harus sesuai dengan konfigurasi Redis pada config/database.php.
Redis Connection untuk Laravel
Contoh konfigurasi Redis:
'redis' => [
'client' => env('REDIS_CLIENT', 'phpredis'),
'default' => [
'host' => env('REDIS_HOST', '127.0.0.1'),
'password' => env('REDIS_PASSWORD'),
'port' => env('REDIS_PORT', 6379),
'database' => env('REDIS_DB', 0),
],
],
Konfigurasi sebenarnya dapat berbeda berdasarkan versi Laravel dan struktur project.
Jika menggunakan Redis untuk beberapa kebutuhan, misalnya cache, queue, dan session, kamu dapat membuat connection yang berbeda sesuai kebutuhan.
Memastikan Redis Berjalan
Sebelum melakukan testing Laravel, pastikan Redis berjalan.
Pada Ubuntu:
sudo systemctl status redis-server
Kemudian:
redis-cli ping
Jika berhasil, hasilnya:
PONG
Jika tidak mendapatkan PONG, perbaiki koneksi Redis terlebih dahulu sebelum melakukan debugging Laravel.
Memastikan PHP Redis Extension Tersedia
Jika Laravel menggunakan PHPRedis, periksa extension:
php -m | grep redis
Jika hasilnya:
redis
berarti extension Redis terdeteksi oleh PHP CLI.
Namun, perlu diperhatikan bahwa PHP CLI dan PHP-FPM dapat menggunakan konfigurasi yang berbeda.
Jika aplikasi menggunakan Nginx + PHP-FPM, pastikan extension Redis juga tersedia pada PHP-FPM yang digunakan oleh aplikasi.
Membersihkan Configuration Cache Laravel
Setelah mengubah .env, Laravel mungkin masih menggunakan konfigurasi lama jika configuration cache aktif.
Jalankan:
php artisan config:clear
Atau jika ingin membersihkan cache framework yang relevan:
php artisan optimize:clear
Setelah itu, Laravel akan membaca konfigurasi terbaru.
Menggunakan Session di Laravel
Setelah session driver dikonfigurasi ke Redis, penggunaan session pada kode aplikasi tetap sama.
Menyimpan data:
session([
'username' => 'Budi'
]);
Mengambil data:
$username = session('username');
Atau menggunakan Session facade:
use Illuminate\Support\Facades\Session;
Session::put('username', 'Budi');
Kemudian:
$username = Session::get('username');
Perbedaan pentingnya adalah cara aplikasi menggunakan session tidak berubah.
Laravel tetap menyediakan API session yang sama, sedangkan backend penyimpanannya berubah menjadi Redis.
Menyimpan Session dengan put()
Contoh:
session()->put('user_id', 123);
Kemudian mengambil:
$userId = session()->get('user_id');
Kita juga dapat menggunakan array:
session()->put([
'user_id' => 123,
'role' => 'admin',
]);
Mengecek Data Session
Gunakan:
if (session()->has('user_id')) {
// User memiliki session
}
Jika ingin memeriksa apakah nilai tersedia dan tidak null, gunakan method yang sesuai dengan kebutuhan aplikasi.
Contoh sederhana:
if (session()->has('username')) {
echo session('username');
}
Menghapus Data Session
Untuk menghapus satu key:
session()->forget('username');
Untuk menghapus beberapa key:
session()->forget([
'username',
'role',
]);
Untuk menghapus seluruh data session:
session()->flush();
Gunakan flush() dengan hati-hati karena seluruh data session akan dihapus.
Flash Session
Laravel juga menyediakan flash session untuk data yang hanya dibutuhkan pada request berikutnya.
Contoh:
session()->flash(
'success',
'Data berhasil disimpan.'
);
Pada Blade:
@if (session('success'))
<div class="alert alert-success">
{{ session('success') }}
</div>
@endif
Flash session sangat cocok untuk pesan seperti:
- Data berhasil disimpan
- Data berhasil dihapus
- Password berhasil diubah
- Proses gagal
- Validasi atau notifikasi tertentu
Contoh Session pada Login
Session biasanya digunakan dalam proses authentication.
Misalnya setelah login berhasil, Laravel dapat menyimpan informasi session yang dibutuhkan oleh mekanisme authentication.
Pada aplikasi Laravel, sebaiknya gunakan sistem authentication Laravel daripada membuat mekanisme login sendiri secara manual.
Contoh penggunaan session secara umum:
session()->put('logged_in', true);
session()->put('user_id', $user->id);
Kemudian:
if (session('logged_in')) {
// User dianggap memiliki session login
}
Namun, untuk aplikasi production, authentication sebaiknya menggunakan mekanisme Laravel yang sesuai agar pengelolaan session, password, middleware, dan keamanan dapat dilakukan dengan benar.
Session Lifetime
Laravel menyediakan konfigurasi lifetime session pada:
config/session.php
Contohnya dapat menggunakan:
'lifetime' => env('SESSION_LIFETIME', 120),
Nilainya biasanya dalam menit.
Misalnya:
SESSION_LIFETIME=120
berarti lifetime session dikonfigurasi selama 120 menit.
Perlu dipahami bahwa lifetime session dan TTL Redis bukan konsep yang selalu identik pada level implementasi. Laravel mengatur masa berlaku session berdasarkan konfigurasi session, sedangkan Redis memiliki mekanisme expiration sendiri.
Karena itu, jangan mengubah TTL Redis secara manual tanpa memahami bagaimana Laravel mengelola session.
Session Cookie dan Redis
Ada satu konsep penting yang sering membingungkan pemula.
Ketika menggunakan Redis sebagai session driver, data session tidak berarti seluruhnya disimpan di browser.
Browser biasanya menyimpan cookie session yang berfungsi sebagai identifier.
Secara sederhana:
Browser
│
│ Session Cookie
↓
Laravel
│
│ Session ID
↓
Redis
│
└── Session Data
Jadi Redis menyimpan data session server-side, sementara browser menyimpan informasi cookie yang memungkinkan Laravel mengidentifikasi session tersebut.
Mengecek Session di Redis
Untuk development, kita dapat melihat key Redis menggunakan Redis CLI.
Masuk:
redis-cli
Kemudian gunakan SCAN untuk mencari key secara aman:
SCAN 0
Struktur key session dapat berbeda tergantung versi Laravel dan konfigurasi session.
Karena itu, jangan bergantung pada nama key tertentu.
Untuk debugging, lebih baik gunakan aplikasi Laravel untuk memastikan session dapat disimpan dan dibaca daripada mengandalkan struktur internal key Redis.
Membuat Route untuk Testing Session
Untuk pengujian sederhana, buat route:
use Illuminate\Support\Facades\Route;
Route::get('/test-session', function () {
session()->put('test_key', 'Hello Redis');
return session('test_key');
});
Akses endpoint tersebut.
Jika konfigurasi benar, response:
Hello Redis
Kemudian kita dapat menguji request berikutnya dengan endpoint lain:
Route::get('/get-session', function () {
return session('test_key', 'Session tidak ditemukan');
});
Jika response:
Hello Redis
berarti Laravel berhasil menyimpan dan mengambil session.
Testing Session dengan Tinker
Kita juga dapat menggunakan Laravel Tinker untuk menguji koneksi Redis secara langsung.
Misalnya:
php artisan tinker
Kemudian:
Cache::put('redis_test', 'Hello Redis', 60);
Ambil:
Cache::get('redis_test');
Jika hasilnya:
"Hello Redis"
berarti Laravel dapat berkomunikasi dengan cache Redis.
Namun, pengujian cache tidak secara otomatis membuktikan session Redis sudah benar. Untuk session, tetap lakukan pengujian melalui request HTTP atau browser.
Menggunakan Redis untuk Session pada Multi-Server Laravel
Salah satu manfaat terbesar session Redis adalah ketika aplikasi Laravel berjalan pada beberapa server.
Contohnya:
Load Balancer
│
┌───────────┴───────────┐
↓ ↓
Laravel App 1 Laravel App 2
│ │
└───────────┬───────────┘
↓
Redis
│
↓
Session Store
User tidak harus selalu kembali ke server yang sama untuk mendapatkan session.
Selama kedua server menggunakan Redis session store yang sama dan konfigurasi aplikasi konsisten, session dapat diakses oleh instance Laravel yang berbeda.
Ini sangat berguna ketika aplikasi menggunakan:
- Load balancer
- Multiple VPS
- Container
- Kubernetes
- Horizontal scaling
- Auto scaling
Redis Session vs File Session
Perbandingan sederhananya:
| Fitur | File | Redis |
|---|---|---|
| Penyimpanan | File server | Redis |
| Akses | Storage lokal | Memory/network |
| Multi-server | Perlu shared storage atau strategi lain | Lebih mudah |
| Setup | Sangat sederhana | Membutuhkan Redis |
| Performa | Cukup untuk aplikasi kecil | Cocok untuk kebutuhan akses cepat |
| Infrastruktur | Lebih sedikit | Membutuhkan Redis service |
File session tetap merupakan pilihan yang valid untuk aplikasi sederhana.
Redis lebih menarik ketika aplikasi membutuhkan session terpusat atau sedang berkembang ke arsitektur multi-server.
Apakah Session Redis Lebih Cepat?
Redis menyimpan data di memory sehingga aksesnya dapat sangat cepat.
Namun, jangan menyimpulkan bahwa Redis selalu membuat seluruh aplikasi Laravel menjadi lebih cepat.
Response aplikasi dipengaruhi banyak faktor:
- Query database
- PHP execution time
- Network latency
- API eksternal
- Rendering Blade
- Cache
- Queue
- Infrastruktur server
Redis hanya mengoptimalkan bagian yang memang menggunakan Redis.
Redis Session vs Database Session
Laravel juga dapat menyimpan session menggunakan database.
Dengan database session:
Laravel
↓
Database
↓
sessions table
Dengan Redis:
Laravel
↓
Redis
↓
Session Store
Database session dapat menjadi pilihan yang sederhana jika aplikasi sudah bergantung pada database dan tidak membutuhkan Redis.
Redis lebih cocok ketika session merupakan bagian dari arsitektur aplikasi yang membutuhkan akses cepat atau shared session storage.
Kapan Sebaiknya Menggunakan Redis untuk Session?
Redis session cocok dipertimbangkan ketika:
- Laravel berjalan di beberapa server
- Menggunakan load balancer
- Session diakses sangat sering
- Redis sudah digunakan untuk cache
- Redis sudah digunakan untuk queue
- Aplikasi membutuhkan centralized session storage
- Aplikasi sedang melakukan horizontal scaling
Untuk aplikasi Laravel kecil pada satu VPS, file session mungkin sudah cukup.
Kesalahan yang Sering Terjadi
Redis Tidak Berjalan
Pastikan:
redis-cli ping
menghasilkan:
PONG
Session Driver Masih Menggunakan File
Periksa:
SESSION_DRIVER=redis
Kemudian pastikan konfigurasi sudah dibaca Laravel.
Configuration Cache Masih Menggunakan Konfigurasi Lama
Jalankan:
php artisan config:clear
atau:
php artisan optimize:clear
PHPRedis Tidak Terpasang
Periksa:
php -m | grep redis
Redis Host Salah
Jika Redis berada pada server berbeda, jangan menggunakan:
REDIS_HOST=127.0.0.1
kecuali Redis memang berada di server Laravel tersebut.
Redis Terbuka ke Internet
Jangan membuka port Redis ke seluruh internet.
Batasi akses Redis melalui firewall dan jaringan internal.
Troubleshooting Error Session Redis
Jika Laravel mengalami error seperti:
Connection refused
periksa:
sudo systemctl status redis-server
Kemudian:
redis-cli ping
Jika Redis aktif, periksa konfigurasi Laravel:
SESSION_DRIVER=redis
REDIS_HOST=127.0.0.1
REDIS_PORT=6379
Setelah itu:
php artisan config:clear
Jika masih bermasalah, periksa:
storage/logs/laravel.log
Cari error Redis atau session yang muncul ketika request dilakukan.
Best Practice Laravel Session dengan Redis
Beberapa praktik yang sebaiknya diterapkan:
Gunakan Redis sebagai Shared Session Store
Jika aplikasi berjalan di banyak server, pastikan semua instance menggunakan Redis yang sama.
Jangan Menyimpan Data Besar di Session
Session sebaiknya menyimpan data yang relatif kecil.
Hindari menyimpan collection atau object besar jika tidak benar-benar diperlukan.
Lebih baik simpan ID kemudian ambil data dari database atau cache ketika diperlukan.
Contoh:
session()->put('cart_id', $cart->id);
daripada menyimpan seluruh object cart ke session.
Gunakan Session untuk Data yang Memang Bersifat Session
Jangan menjadikan session sebagai pengganti database.
Session cocok untuk informasi sementara yang berkaitan dengan user atau request flow.
Lindungi Infrastruktur Redis
Redis sebaiknya berada pada jaringan yang terpercaya dan tidak terbuka untuk publik.
Perhatikan Session Lifetime
Sesuaikan:
SESSION_LIFETIME=120
dengan kebutuhan keamanan dan pengalaman pengguna.
Gunakan HTTPS
Session authentication sangat bergantung pada keamanan cookie.
Production Laravel sebaiknya menggunakan HTTPS dan konfigurasi cookie yang sesuai.
Contoh Konfigurasi Sederhana
Untuk Laravel yang menggunakan Redis pada server yang sama:
SESSION_DRIVER=redis
REDIS_CLIENT=phpredis
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
SESSION_LIFETIME=120
Setelah mengubah .env:
php artisan optimize:clear
Kemudian pastikan Redis aktif:
redis-cli ping
Jika:
PONG
maka Redis server dapat diakses.
Contoh Alur Session Login
Secara sederhana, alurnya dapat digambarkan:
User Login
↓
Laravel Validasi Credential
↓
Authentication Berhasil
↓
Laravel Membuat/Memperbarui Session
↓
Session Disimpan di Redis
↓
Browser Menerima Session Cookie
↓
Request Berikutnya
↓
Laravel Membaca Session dari Redis
↓
User Tetap Terautentikasi
Dengan Redis sebagai shared session store, beberapa instance Laravel dapat membaca session yang sama.
Redis Session Tidak Menggantikan Authentication Laravel
Menggunakan Redis sebagai session driver bukan berarti kita harus membuat sistem authentication sendiri.
Redis hanya menentukan di mana data session disimpan.
Authentication tetap dapat menggunakan fitur Laravel seperti:
- Authentication middleware
- Login
- Logout
- User provider
- Session authentication
- Authorization
Dengan kata lain:
Authentication
+
Session
+
Redis
adalah bagian yang berbeda tetapi dapat bekerja bersama.
Kesimpulan
Laravel Session dengan Redis memungkinkan aplikasi menyimpan data session pada Redis sehingga session dapat diakses dengan cepat dan digunakan sebagai shared storage untuk beberapa instance aplikasi.
Konfigurasi dasarnya cukup sederhana:
SESSION_DRIVER=redis
REDIS_HOST=127.0.0.1
REDIS_PORT=6379
Setelah konfigurasi selesai, penggunaan session di Laravel tetap sama:
session()->put('user_id', $user->id);
$userId = session('user_id');
Perubahan utamanya berada pada backend penyimpanan session.
Redis sangat berguna ketika aplikasi Laravel mulai menggunakan:
- Multiple server
- Load balancer
- Container
- Horizontal scaling
- Redis Cache
- Laravel Queue
Namun, untuk aplikasi kecil pada satu server, Redis belum tentu diperlukan. File atau database session mungkin sudah cukup.
Jika menggunakan Redis, pastikan Redis berjalan dengan baik, konfigurasi Laravel benar, session lifetime sesuai kebutuhan, dan akses Redis diamankan.
Dengan memahami hubungan antara Laravel Session, Redis, authentication, dan shared session storage, kita dapat membangun aplikasi Laravel yang lebih siap untuk berkembang dari satu server menjadi beberapa instance.
