Izbor mehanizma za skladištenje sesija može napraviti veliku razliku u performansama kod velikih i visoko posjećenih PHP aplikacija
Poboljšanje performansi izborom mehanizma za skladištenje sesija se neće osjetiti pri učitavanju za manji broj korisnika i nije nešto što će posjetioci ili korisnici uočiti tokom regularnog pregledavanja ili korištenja vaših web aplikacija.
Međutim, za visoko posjećene web stranice i aplikacije, datoteke, odnosno diskovi, trebaju biti posljednja opcija kao mehanizam za skladištenje korisničkih sesija.
Ukratko o problemu
Kao što možda znate, sesija se spašava na disk u vidu tekstualne datoteke. Sesije su obično ograničene određenim vremenskim intervalom. Vremenom, nakon što isteknu, njih će trebati obrisati, što je zadatak PHP garbage collector-a. Vremenom, taj broj datoteka se enormno povećava, pogotovo kod visoko posjećenih aplikacija i to je zapravo situacija u kojoj nastaje problem. Kada se pokrene PHP garbage collector, isti mora provjeriti sve kreirane sesije kako bi one koje su istekle i obrisao. Provjeravanje pola miliona sesija ili i više, će značajno opteretiti servere na kojima se pokreće vaša aplikacija. Sličan problem smo imali na SportSport.ba, koji je jedan od najposjećenijih projekta koje smo radili sa blizu 5 miliona sesija u rasponu od 30 dana.
Rješenje
Rješenje, odnosno izbor treba da padne na skladištenje sesija u RAM memoriju. Očekivano, to će biti značajno brže i pouzdanije rješenje, jer svi znamo da je čitanje iz RAM memorija mnogo brže na sa diskova.
Kada je u pitanju PHP, možete se osloniti na Redis ili Memcached servere. Trenutno, naš izbor je Redis, mada u ranijim slučajevima smo koristili i Memcached.
Plain PHP rješenje
Ako govorimo o projektima koji se pisani u plain PHP, onda je dovoljno podesiti session.save_handler i session.save_path direktive, kao na primjeru ispod.
Naravno, ako vam je dostupna php.ini datoteka, onda ove postavke možete zamijeniti u njoj. Treba imati na umu da trebate imati instaliran Redis na određenom portu na serveru, te određenu PHP ekstenziju (php_redis.dll).
Laravel rješenje
Ako govorimo o Laravel projektima, onda je podešavanje Redis servera kao mehanizma za skladištenje sesija još jednostavnije. Sve što je potrebno je u .env datoteci podesiti SESSION_DRIVER postavku na vrijednost 'redis'.
SESSION_DRIVER=redis
Prethodno je potrebno instalirati Predis klijent koji Laravel koristi za komuniciranje sa Redisom.
Redis kao paraleni mehanizam za skladištenje sesija i cachea - mogući problem
Ukoliko ste već odabrali Redis kao mehanizam za skladištenje sesija, za pretpostaviti je da radite na većoj i posjećenoj Laravel aplikaciji, i vjerovatno ste koristili Laravel Cache biblioteku sa ciljem povećanja performansi, odnosno izvršavanja SQL upita ili određenih kalkulacija. U tom slučaju, možete podesiti mehanizam za skladištenje cache datoteka, umjesto zadanog mehanizma (disk), također na Redis bazu.
Međutim, paralelnim korištenjem Redis-a kao mehanizama za skladištenje i sesija i cache datoteka, onda možete imati problem da prilikom čišćenja cache-a (npr. php artisan cache:clear), zapravo i izbrišete validne sesije iz Redisa, što će odjaviti sve korisnike sa vaše aplikacije. Ako se to dešava često (npr. pri objavi svakog članka ili nakon X minuta putem cron joba), onda to može biti neopisivo frustrirajuće za vaše korisnike.
U tom slučaju, potrebno je razdvojiti konekciju i bazu za sesije i cache, kao u primmjeru ispod.