Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

PHP i session handling

[es] :: PHP :: PHP i session handling

[ Pregleda: 2641 | Odgovora: 16 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

seymour
student
Novi sad

Član broj: 57634
Poruke: 65
*.dynamic.sbb.rs.

Sajt: www.extrafull.com


Profil

icon PHP i session handling05.07.2008. u 19:49 - pre 191 meseci
Da li se kod ozbiljnih projekata isplati imati session handling preko baze podataka(koristeci session_set_save_handler ) ili je bolja varijanta da se normalno koristi $_SESSION objekat za trenutnog korisnika, a za svaki korisnicki zahtev da se posebno u nekoj tabeli (sessions npr) vrsi nesto kao

REPLACE INTO `sessions` VALUES ('.$id.','.$time.','.$data->data.','.$data->id.')';
za unosenje/promenu podataka o trenutnoj sesiji,
a potom i
DELETE FROM `sessions` WHERE time < '.$old;
za uklanjanje svih sesija starijih od $old vremena

Ta tabela session bi cisto sluzila da bi se moglo odrediti "who is online" i neke slicne funkcije, dok bi se sve ostale varijable(bitne za funckionisanje sistema) za nekog korisnika cuvale u $_SESSION objektu.

Sta mislite koja je varijanta bolja i zasto?



"necu da budem hipster kao ovi arhitekti koji znaju svakom ime, sta je radio, gde zivi, gde mu je office, gde drzi predavanja i sl... I onda kada vidis neku gradjevinu prvi put treba da pogodis cija je na osnovu stila. Bljak!"
 
Odgovor na temu

Man-Wolf
Mihailo Joksimovic
Beograd

Član broj: 17016
Poruke: 873
*.eunet.yu.



+13 Profil

icon Re: PHP i session handling05.07.2008. u 23:11 - pre 191 meseci
Mislim da bi bilo bolje da sve cuvas u SESSION varijabli, a u bazu upisujes samo najosnovnije podatke (citaj -> Username i Vreme) o korisniku, koje su ti potrebne za WHO IS ONLINE itd ... Ja recimo nebi uplitao bazu za nesto sto moze da radi i bez nje

P.S. Uostalom, skini neki projekat, pa vidi kako je radjen )
 
Odgovor na temu

seymour
student
Novi sad

Član broj: 57634
Poruke: 65
*.dynamic.sbb.rs.

Sajt: www.extrafull.com


Profil

icon Re: PHP i session handling06.07.2008. u 10:55 - pre 191 meseci
Vidim da ti je jedan od ciljeva da napravis forum :). Kako mislis da napravis funkciju za ispis ko sve trenutno pregleda neku temu bez uplitanja baze(naravno sve se ovo lakse resava u ozbiljnijim jezicima od PHP-a, ali u nasim slucajevima(jeftin hosting....) ograniceni smo na upotrebu PHP-a)?

Izgleda da sam postavio pitanje u pogresan forum. Molio bih moderatore u tom slucaju da je prebace u PHP advanced.
"necu da budem hipster kao ovi arhitekti koji znaju svakom ime, sta je radio, gde zivi, gde mu je office, gde drzi predavanja i sl... I onda kada vidis neku gradjevinu prvi put treba da pogodis cija je na osnovu stila. Bljak!"
 
Odgovor na temu

Man-Wolf
Mihailo Joksimovic
Beograd

Član broj: 17016
Poruke: 873
*.eunet.yu.



+13 Profil

icon Re: PHP i session handling06.07.2008. u 11:40 - pre 191 meseci
Citat:
seymour: Vidim da ti je jedan od ciljeva da napravis forum :). Kako mislis da napravis funkciju za ispis ko sve trenutno pregleda neku temu bez uplitanja baze(naravno sve se ovo lakse resava u ozbiljnijim jezicima od PHP-a, ali u nasim slucajevima(jeftin hosting....) ograniceni smo na upotrebu PHP-a)?


Jesi procitao moj prethodni post ??

Citat:
Man-Wolf: Mislim da bi bilo bolje da sve cuvas u SESSION varijabli, a u bazu upisujes samo najosnovnije podatke (citaj -> Username i Vreme) o korisniku, koje su ti potrebne za WHO IS ONLINE itd ... Ja recimo nebi uplitao bazu za nesto sto moze da radi i bez nje :-)


:-)
 
Odgovor na temu

seymour
student
Novi sad

Član broj: 57634
Poruke: 65
*.dynamic.sbb.rs.

Sajt: www.extrafull.com


Profil

icon Re: PHP i session handling06.07.2008. u 12:18 - pre 191 meseci
Za to sto sam naveo minimalno treba i id kategorije i id threada(naravno mozes sve cuvati kao sting catid=XXX&threadId=XXX) :).

Pricam o ozbiljnijim projektima bez uvrede.

Znaci fora je da ako cuvas podatke u $_SESSION varijabli trosis memoriju(a zamisli da imas sajt gde svako malo neko uploaduje slike od 300K), a ovako trosis sql resurse. Zato me interesuje koji su najbolji pristupi u praksi. Neki design pattern sto se tice sesija i PHP-a.
"necu da budem hipster kao ovi arhitekti koji znaju svakom ime, sta je radio, gde zivi, gde mu je office, gde drzi predavanja i sl... I onda kada vidis neku gradjevinu prvi put treba da pogodis cija je na osnovu stila. Bljak!"
 
Odgovor na temu

stsung
NS

Član broj: 12899
Poruke: 432
89.110.199.*



+2 Profil

icon Re: PHP i session handling06.07.2008. u 13:07 - pre 191 meseci
Pozd.

Kakve veze ima upload slike od 300K sa sesijom?

I u normalnim (da kazhemo i ozbiljnim) projektima, koristi se jedna Session singleton klasa koja obavlja operacije sa sesijama.

Svako dobro.
 
Odgovor na temu

seymour
student
Novi sad

Član broj: 57634
Poruke: 65
*.dynamic.sbb.rs.

Sajt: www.extrafull.com


Profil

icon Re: PHP i session handling06.07.2008. u 13:35 - pre 191 meseci
Nema nikakve veze, osim sto sve skupa trosi resurse(memorijske).

Ok, logicno je da bude singleton. Evo neke moje klase(nije singleton) sto sam sklepao a prepusta manipulaciju sa sesijama bazi. Kako bi ti resio isti problem?
Code:

<?php
define('SESSION_TIME',21*60);
class Session{
    /*
CREATE TABLE `sessions` (
  `id` varchar(200) NOT NULL,
  `time` int(10) unsigned,
  `data` text,
  `userid` int(11) int,
  PRIMARY KEY (`id`),
  KEY (`userid`)
);    
    */
    public static $server = '127.0.0.1';
    public static $user = 'root';
    public static $pass = '';
    public static $db = 'sessions';
    public static $magic_quotes;
    private static $_sess_conn;
    
    public static function init($sn=null,$un=null,$ps=null,$db=null){
        ini_set('session.save_handler', 'user');
        session_set_save_handler(
                                                 array('Session', 'open'),
                         array('Session', 'close'),
                         array('Session', 'read'),
                         array('Session', 'write'),
                         array('Session', 'destroy'),
                         array('Session', 'gc')
                         );        
        if (session_id() === "") session_start();   
        self::$magic_quotes = get_magic_quotes_gpc();
        if ($sn != null){
            self::$server = $sn;
        }
        if ($un != null){
            self::$user = $un;
        }
        if ($ps != null){
            self::$pass = $ps;
        }
        if ($db != null){
            self::$db = $db;
        }                       
    }
    
    public static function open(){                
    if ( self::$_sess_conn = mysql_connect( self::$server, self::$user, self::$pass ) ){
          return mysql_select_db(self::$db, self::$_sess_conn);
    }
    return false;
    }

  
  public static function close(){
        return  mysql_close(self::$_sess_conn);
    }

     public static function read($id) {
    $id = self::escape($id);
    $sql = 'SELECT `data` FROM `sessions` WHERE id='.$id;
    if ($result = mysql_query($sql, self::$_sess_conn) ) {
        if (mysql_num_rows($result)) {
           $record = mysql_fetch_assoc($result);
           return $record['session_data'];
        }
     }
     return null;
  }    
  
  public static function toData($user){
       if ($user->gid < 0){
           $data->id = 0;
       }
       else{
           $data->id = $user->id;
       }
       $data->data = serialize($user);
       return $data;
  }
  
  public static function fromData(){
       return unserialize($_SESSION['data']);
  }
      
  
    public static function write($id, $data){
        $time = time();
        $id = self::escape($id);
        $data = self::toData($data);
        $sql = 'REPLACE INTO `sessions` VALUES ('.$id.','.$time.','.$data->data.','.$data->id.')';
        return mysql_query($sql, self::$_sess_conn);
    }  
    
    public static function destroy($id) {
         $id = self::escape($id);
     $sql = 'DELETE FROM  `sessions` WHERE id='.$id;
     return mysql_query($sql, self::$_sess_conn);
  }

    public static function destroyAllUser($id) {
     $sql = 'DELETE FROM `sessions` WHERE userid='.$id;
     return mysql_query($sql, self::$_sess_conn);
  }
  
  public static function gc($max) {
       $old = time() - SESSION_TIME;
         $sql = 'DELETE FROM `sessions` WHERE time < '.$old;
    return mysql_query($sql, self::$_sess_conn);
  }
  
    public static function escape( $text ){
      if ( self::$magic_quotes ) {
       $text = stripslashes( $text );
    }
    $text = mysql_real_escape_string( $text );
    return '''.$text.''';
    }
    
}
?>

"necu da budem hipster kao ovi arhitekti koji znaju svakom ime, sta je radio, gde zivi, gde mu je office, gde drzi predavanja i sl... I onda kada vidis neku gradjevinu prvi put treba da pogodis cija je na osnovu stila. Bljak!"
 
Odgovor na temu

Man-Wolf
Mihailo Joksimovic
Beograd

Član broj: 17016
Poruke: 873
*.eunet.yu.



+13 Profil

icon Re: PHP i session handling06.07.2008. u 14:07 - pre 191 meseci
@seymour - Samo sam dao misljenje :-) Ja recimo ne planiram da uplicem bazu u nesto sto moze da se odradi samo koristeci sesije :-)

Al, posto se radi o nekom ozbiljnom projektu, necu se mesam vise, samo sam hteo da dam misljenje :-))

Pozdrav!
 
Odgovor na temu

stsung
NS

Član broj: 12899
Poruke: 432
89.110.199.*



+2 Profil

icon Re: PHP i session handling06.07.2008. u 14:11 - pre 191 meseci
Pozd.

Nemam bash obichaj da se udubim ovako u nechiji kod na forumu, ali nabrzaka pogledano, pretpostavljam da mozhe da predstavlja adekvatno reshenje. No, ako je deo nekog veceg projekta bilo bi bolje da DB layer bude izdvojen, jer je potreban i ostatku aplikacije, ne samo sesiji. Klasa koju ja koristim kao deo mog frameworka mi datira josh od pre 7-8 godina, i tada je bilo chudnih problema sa session_set_save_handler(), zbog chega ona uopshte ne koristi session manipulaciju koja je ugradjena u PHP, vec radi na svoj nachin. Sigurno je to vec sve ispravljeno, ali sada bi me mrzelo da to menjam, a sve jelda radi bez ikakvih problema.

Tvoja klasa se oslanja na statichku implementaciju, tako da bi je napravio singleton, dovoljno bi bilo da zabranish instanciranje klase u aplikaciji.

Za troshenje resursa ... normalno je da troshi resurse, ako si stavio upload formu na sajt pa ti neko uploaduje sliku to ce potroshiti resurse, nema tu shta - no nece valjda svaki zahtev na sajtu da bude vezan sa uploadovanjem nekih slika. Sesija ce za svaki request da se uchitava i da sadrzhi neke podatke koji su ti potrebni da bi aplikacija pravilno funkcionisala, to se ne mozhe izbeci. No pretpostavljam da necesh stavljati sliku od 300K u sesiju, ne vidim svrhu toga.

Svako dobro.
 
Odgovor na temu

seymour
student
Novi sad

Član broj: 57634
Poruke: 65
*.dynamic.sbb.rs.

Sajt: www.extrafull.com


Profil

icon Re: PHP i session handling06.07.2008. u 14:48 - pre 191 meseci
Da, imam posebnu klasu(ona je singleton) koja se stara za komunikaciju sa bazom(Princip mi je da se po jednom HTTP zahtevu na pocetku inicijalne skripte otvori konekcija i onda sve skripte koje su zaduzene za izvrsavanje responsea koriste tu konekciju. Konekcija se pre zavrsetka inicijalne skripte zatvara).

Medjutim za sesije sam predvideo da se(u slucaju da se koristi baza) komunicira sa drugom(zasebnom) bazom sa samo jednom tabelom-tabelom sesija.

Problem sa onim prvim pristupom koji sam postovao je sto sam ga napisao na osnovu primera na netu i nije mi potuno jasan
princip rada te manipulacije sa sesijama(nekako mi deluje da se previse opterecuje baza, a to mi je trenutno najveci problem pored bandwitha).

Trenutno mi ovo zvuci kao najbolji pristup(ne znam dali je moguc onaj deo sa cron jobom):

1.Napraviti klasu za manipulaciju sa sesijama na klasican nacin (u initu/constructoru - session_start, u delete - session_destroy, u setSession - $_Session['data']=$data...).
2. Pri svakom HTTP zahtevu uraditi replace podataka trenutne sesije u session tabeli(ako je nova sesija insert, ako je stara update time poslednjeg accessa, i drugih podataka koji su neophodni).
3.U cronu podesiti da se na svakih XXX minuta startuje skripta koja brise podatke iz te tabele koji su stariji od YYY vremena.

Sta mislite o ovome pristupu koji sam predlozio i da li je moguc? Mozda sam trebao napomenuti, da mi se sajt do sada oslanjao na Joomla! framework, koji je bio zaduzen za sesije(otuda moje nedovoljno poznavanje manipulacije sa njima u PHP; ipak sam iskusniji u Javi), ali sam totalno nezadovoljan njime-previse upita, redundantan kod, itd... A sajt mi postaje previse zahtevan da bi se i dalje mogao zasnivati na Joomla frameworku.


"necu da budem hipster kao ovi arhitekti koji znaju svakom ime, sta je radio, gde zivi, gde mu je office, gde drzi predavanja i sl... I onda kada vidis neku gradjevinu prvi put treba da pogodis cija je na osnovu stila. Bljak!"
 
Odgovor na temu

stsung
NS

Član broj: 12899
Poruke: 432
89.110.199.*



+2 Profil

icon Re: PHP i session handling06.07.2008. u 15:03 - pre 191 meseci
Pozd.

Posebna klasa koju imash treba da se koristi za ceo ostatak aplikacije. Ovo nema veze sa time da li ce tvoja klasa za sesije koristiti odvojenu bazu, iako smatram da za ovo nema nikakve potrebe, jer time upravo opterecujesh celu stvar time shto svaki request ce morati da pravi 2 konekcije ka bazi.

Koliku posecenost imash/ochekujesh na sajtu da ti treba posebna baza za sesije?

Pri svakom requestu korisnika, tabela sesija mora da se updatuje da bi se promenilo poslednje vreme pristupa. Ako ovo ne radish, nakon shto se sesija kreira, i prodje podesheno vreme koliko sesija traje, bez obzira shto je korisnik svo vreme bio aktivan na sajtu bice izbachen jer mu je sesija istekla. Ovo nije previshe zahtevna operacija da bi trebalo da te zabrinjava.

Mislim da nema potrebe da koristish cron job za uklanjanje starih sesija. Dovoljno je ostaviti da to php odredi kada je vreme za to.

Svako dobro.
 
Odgovor na temu

seymour
student
Novi sad

Član broj: 57634
Poruke: 65
*.dynamic.sbb.rs.

Sajt: www.extrafull.com


Profil

icon Re: PHP i session handling06.07.2008. u 15:12 - pre 191 meseci
Ok, znaci sve preko jedne baze(tako sam i mislio u pocetku ,ali mi se(negde sam procitao na netu), ovo sa dve koneckije ucinilo za trenutak kao bolja varijanta).

U principu ti predlazes sledeci pristup:
Svaki HTTP request zahteva dva sql poziva(pseudo kod):
1. Relace INTO sessions VALUES (session_id,time_acces[,time_started],data,user_id)
2. DELETE FROM sesssions WHERE time_acces < XXX
3. Sve ostale manipulacije sa trenutnim korisnikom radim preko $_SESSION objekta

Da li sam dobro shvatio? Mada i dalje mislim da je cron dobar jer bi (posto imam dosta zahteva, a trajanje sesije mi je oko 20 minuta) mogao da ustedi krsha sql zahteva.
"necu da budem hipster kao ovi arhitekti koji znaju svakom ime, sta je radio, gde zivi, gde mu je office, gde drzi predavanja i sl... I onda kada vidis neku gradjevinu prvi put treba da pogodis cija je na osnovu stila. Bljak!"
 
Odgovor na temu

stsung
NS

Član broj: 12899
Poruke: 432
89.110.199.*



+2 Profil

icon Re: PHP i session handling06.07.2008. u 15:28 - pre 191 meseci
Pozd.

Brisanje sesija se ne radi svakim requestom, vec samo povremeno, prema unutrashnjoj logici.

Pristup korishcenja funkcija za manipulaciju sa sesijama u samom PHP-u bi trebao biti najoptimalniji. Ne mogu da ovo sada i potvrdim jer ko shto rekoh ja tako ne radim, ali to samo zato shto je ranije u PHP4 bilo problema sa time, pa klasa koju ja koristim ne koristi session handling koji je ugradjen u php.

Svaki zahtev ce prvo imati SELECT, jer mora prvo da uzme podatke iz sesije, naravno ako postoje. Potom ce imati REPLACE koji ce podatke updatovati (ovde bi bilo optimalnije koristiti UPDATE umesto REPLACE, jer replace fizichki radi DELETE/INSERT). Jednom kada definishesh svoje callback funkcije za rad sa sesijama, nastavljash da radish normalno sa $_SESSION, a php ce automatski zvati tvoje funkcije za manipulaciju vec prema tome shta je potrebno uraditi.

Svako dobro.
 
Odgovor na temu

seymour
student
Novi sad

Član broj: 57634
Poruke: 65
*.dynamic.sbb.rs.

Sajt: www.extrafull.com


Profil

icon Re: PHP i session handling06.07.2008. u 15:31 - pre 191 meseci
Da li bi mogao ovo malo bolje da mi objasnis? Tj da das primer neki ili malo opsirnije definises
"Brisanje sesija se ne radi svakim requestom, vec samo povremeno, prema unutrashnjoj logici."
Hvala ti unapred :).
"necu da budem hipster kao ovi arhitekti koji znaju svakom ime, sta je radio, gde zivi, gde mu je office, gde drzi predavanja i sl... I onda kada vidis neku gradjevinu prvi put treba da pogodis cija je na osnovu stila. Bljak!"
 
Odgovor na temu

stsung
NS

Član broj: 12899
Poruke: 432
89.110.199.*



+2 Profil

icon Re: PHP i session handling06.07.2008. u 16:03 - pre 191 meseci
Pozd.

Uklanjanje sesija vrshi unutrashnji garbage collector (zbog toga imash posebnu callback funkciju gc()). Unutrashnja logika php-a povremeno okida ovaj proces prema verovatnoci definisanoj u konfiguracionim parametrima session.gc_probability i session.gc_divisor koji izrachunavanjem davaju procenat verovatnoce da ce se garbage collector okinuti u trenutnom requestu. Na ovo takodje utiche i session.gc_maxlifetime koji govori vreme u sekundama nakon kojeg se sachuvani podaci smatraju djubretom.

Svako dobro.
 
Odgovor na temu

seymour
student
Novi sad

Član broj: 57634
Poruke: 65
*.dynamic.sbb.rs.

Sajt: www.extrafull.com


Profil

icon Re: PHP i session handling06.07.2008. u 17:46 - pre 191 meseci
Upravo sam zavrsio Session,User i Database klase(sve su naravno singletoni) koje ce predstavljati osnovu mog buduceg frameworka.
Takodje sam na tvoju preporuku uradio da ako je nova sesija radim INSERT, a ako je stara radim UPDATE(umesto jednog REPLACE-a).
Hvala ti puno u vezi pojasnjenja za database session handling!!!

"necu da budem hipster kao ovi arhitekti koji znaju svakom ime, sta je radio, gde zivi, gde mu je office, gde drzi predavanja i sl... I onda kada vidis neku gradjevinu prvi put treba da pogodis cija je na osnovu stila. Bljak!"
 
Odgovor na temu

stsung
NS

Član broj: 12899
Poruke: 432
89.110.199.*



+2 Profil

icon Re: PHP i session handling06.07.2008. u 17:59 - pre 191 meseci
Pozd.

Konkretno za INSERT/UPDATE mozhesh da koristish ON DUPLICATE KEY mysql konstrukciju, i time proces obavish u jednom upitu.

Svako dobro.
 
Odgovor na temu

[es] :: PHP :: PHP i session handling

[ Pregleda: 2641 | Odgovora: 16 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.