Redis ve oturum
Gömülü RESP sürücüsü, session modülü, çerez ayarları, flash ve çakışma yönetimi.
use redis
$redis = new redis({
host: "localhost",
port: 6379,
db: 0,
password: "1234"
}).connect()Sürücü çekirdeğe gömülüdür: RESP protokolü doğrudan konuşulur, harici bir Go paketi kullanılmaz. Havuz yoktur — postgres ile aynı model.
| Çağrı | Döner |
|---|---|
$redis.connect() | $redis (zincirlenebilir) |
$redis.ping() | "PONG" |
$redis.get($key) | değer ya da null |
$redis.set($key, $value) | $redis |
$redis.set($key, $value, {lifetime: 60}) | $redis — ömür dakika |
$redis.has($key) | true / false |
$redis.delete($k1, $k2, …) | silinen sayısı |
$redis.expire($key, $dakika) | true / false |
$redis.ttl($key) | kalan saniye ya da null |
$redis.increment($key) | yeni değer |
$redis.command("LPUSH", "kuyruk", "iş") | ham yanıt |
$redis.close() / $redis.is_closed() | — |
Nesne ve diziler JSON olarak yazılır:
$redis.set("kullanici", {id: 42, ad: "Ali"}) # {"id":42,"ad":"Ali"}command, modülün sunmadığı komutlar için kaçış kapısıdır.
Oturum#
use redis, session
$redis = new redis({host: "localhost", port: 6379, db: 0}).connect()
session.redis = $redis
session.start()
$user = session.get("user")
if $user == null then
out("Giriş yapılmadı")
end ifsession.redis atanabilen tek modül alanıdır; modüller bunun dışında salt okunurdur.
Oturum durumu her isteğe özeldir — modül her use session için yeniden üretilir, istekler arasında sızmaz.
Sıra önemlidir: session.redis ve session.config.set start()'tan önce gelmelidir — start() çerezi o ayarlarla okur.
Depolama modeli#
| Katman | Ne tutuyor |
|---|---|
| Çerez | yalnızca session_id |
| Redis anahtarı | lexer:session:{id} |
| Redis değeri | {id, version, created_at, last_activity, data, flash} |
session.get/set | yalnızca data kısmı |
Boş bir oturum Redis'e yazılmaz — ilk veri yazılana kadar kayıt oluşmaz, böylece hiçbir şey yapmayan ziyaretçiler ve botlar için boş kayıt birikmez.
secret diye bir ayar yoktur: çereze yalnızca 128 bit rastgele kimlik gider, veri Redis'te durur. İmzalama, veriyi çerezde taşıyan tasarımlarda gerekir.
Yöntemler#
| Çağrı | Açıklama |
|---|---|
session.start() | başlatır / devam ettirir, kimliği döner |
session.id() | mevcut session_id |
session.get($key[, $default]) | değer, yoksa null / $default |
session.set($key, $value) | sürüm kontrollü yazar |
session.has($key) · session.delete($key) | |
session.clear() | veriyi siler, kimlik kalır |
session.destroy() | kaydı, veriyi ve çerezi yok eder |
session.regenerate() | yeni kimlik üretir, veriyi taşır |
session.all() · session.meta() |
Çerez ayarları#
session.config.set({
cookie_name: "lexer-id", # varsayılan LEXER_SESSION_ID
cookie_lifetime: 1440, # dakika; varsayılan 120, 0 = oturum çerezi
cookie_path: "/",
cookie_domain: "", # boş = yalnızca isteği karşılayan alan adı
cookie_secure: true, # varsayılan false
cookie_httponly: true, # varsayılan true
cookie_samesite: "Lax" # Lax | Strict | None
})SameSite: None verildiğinde Secure otomatik açılır — tarayıcılar aksi halde çerezi tümden yok sayar.
Anahtarlar doğrulanır. Yanlış yazılan bir ayar sessizce yok sayılmaz:
session.config.set: bilinmeyen ayar "cookie_http_only";
"cookie_httponly" mi demek istediniz?Sessiz kalsaydı cookie_secure yazım hatası çerezi korumasız bırakırdı.
Flash veri#
Bir sonraki istekte yaşayan verilerdir.
session.flash("success", "Profiliniz güncellendi") # yazar
$mesaj = session.flash("success") # okur ve silerOkunmazsa bir istek daha durur, ondan sonrakinde silinir. Ek olarak session.flash_has, session.flash_all, session.reflash, session.keep_flash.
Çakışma yönetimi#
Varsayılan optimistic locking: her yazma sürümü kontrol eder, çakışırsa kaydı yeniden okur, değişikliği tazelenmiş verinin üzerine uygular ve yeniden dener (varsayılan 3 kez). Tükenirse SessionConflictError fırlar.
Birden fazla yazmayı tek seferde yapmak için:
session.with_lock(func()
$n = session.get("sayac", 0)
session.set("sayac", $n + 1)
end func)try
session.set("sepet", $sepet)
catch($e)
if $e.type == "SessionConflictError" then
out("oturum çakıştı")
end if
end tryGiriş sonrası#
session.regenerate()
session.set("user_id", $kullanici.id)Girişten sonra kimliği yenilemek, saldırganın önceden bilinen bir kimliği kurbanın tarayıcısına yerleştirmesini (session fixation) etkisiz kılar.