İçeriğe geç
LexerLangv0.1.0

Redis ve oturum

Gömülü RESP sürücüsü, session modülü, çerez ayarları, flash ve çakışma yönetimi.

LexerLang
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:

LexerLang
$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#

LexerLang
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 if

session.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#

KatmanNe tutuyor
Çerezyalnızca session_id
Redis anahtarılexer:session:{id}
Redis değeri{id, version, created_at, last_activity, data, flash}
session.get/setyalnı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ı#

LexerLang
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:

Metin
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.

LexerLang
session.flash("success", "Profiliniz güncellendi")   # yazar
$mesaj = session.flash("success")                    # okur ve siler

Okunmazsa 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:

LexerLang
session.with_lock(func()
    $n = session.get("sayac", 0)
    session.set("sayac", $n + 1)
end func)
LexerLang
try
    session.set("sepet", $sepet)
catch($e)
    if $e.type == "SessionConflictError" then
        out("oturum çakıştı")
    end if
end try

Giriş sonrası#

LexerLang
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.

Sırada#

Durum yönetimi.