Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> własna obsługa sesji, dużo zapytań :/
Apo
post
Post #1





Grupa: Zarejestrowani
Postów: 426
Pomógł: 1
Dołączył: 2.10.2005

Ostrzeżenie: (0%)
-----


Witam
Ostanio pisałem własną obsługe sesji opartą na bazie mysql. Oto kod:

  1. <?php
  2. /**
  3. *@author Apo
  4. *@package Obsluga sesji
  5. */
  6.  
  7. require_once('db.php');
  8.  
  9. db::connect('localhost', 'root', '', 'session');
  10.  
  11. $session = new session();
  12.  
  13. // przykład
  14.  
  15. $session->imie = 'Alfred';
  16.  
  17. try
  18. {
  19. echo $session->imie;
  20. } catch(SessionException $e)
  21. {
  22. echo $e->getMessage();
  23. }
  24.  
  25.  // klasa
  26.  
  27. final class session {
  28.  
  29. // unikalny numer identyfikacyjny uzytkownika
  30. private $id = null;
  31.  
  32. // nazwa tabeli w bazie danych gdzie beda trzymane sesje
  33. private $table = '`session`';
  34.  
  35. // ilosc czasu (w sekundach) przez jaką ma być wazna sesja
  36. private $limit = 3600;
  37.  
  38. // tablica z danymi
  39. private $sessionTable = array();
  40.  
  41.  /**
  42.  * Konstruktor sprawdza czy dany uzytkownik ma juz utworzoną sesje, jesli nie je
    st ona tworzona
  43.  *
  44.  */
  45. public function __construct()
  46. {
  47. $this->id = $this->hash();
  48.  
  49. if(!$this->getSessionRows())
  50. $this->createSession();
  51. }
  52.  
  53.  /**
  54.   * Tworzy unikalny numer identyfikacyjny dla kazdego uzytwownika
  55.   *
  56.   * return String
  57.   */
  58. private function hash()
  59. {
  60. return md5($_SERVER['REMOTE_ADDR'] . addslashes($_SERVER['HTTP_USER_AGENT']));
  61. }
  62.  
  63.  /**
  64.   * Sprawdza czy uzytkownik ma utworzona sesje na podstawie ilosci rekordow w bazi
    e
  65.   *
  66.   * return Boolean
  67.   */
  68. private function getSessionRows()
  69. {
  70. db::query('SELECT `czas`, `dane` FROM '.$this->table.'
  71.  WHERE `id`=''.$this->id.'' AND `czas`>'.(time()-$this->limit));
  72.  
  73. if(db::num_rows() == 1)
  74. {
  75. $dane = '';
  76. while($array = db::fetch_row())
  77. $dane = $array;
  78.  
  79. $this->sessionTable = unserialize($dane['dane']);
  80. return true;
  81. }
  82. else
  83. return false;
  84. }
  85.  
  86.  /**
  87.   * Tworzy sesje dla uzytkownika
  88.   *
  89.   * return query
  90.   */
  91. private function createSession()
  92. {
  93. db::query('DELETE FROM '.$this->table.' WHERE id=''.$this->id.''');
  94. return db::query('INSERT INTO '.$this->table.'(`id`, `czas`) VALUES(''.$this->id.'', ''.time().'')');
  95. }
  96.  
  97.  /**
  98.   * Przychwytuje przypisywanie wartosci do niezdefiniowanych skladowych i dodaje d
    o tablicy ktora zostanie zapisana
  99.   *
  100.   */
  101. public function __set($name, $value)
  102. {
  103. return $this->sessionTable[$name] = $value;
  104. }
  105.  
  106.  /**
  107.   * Przychwytuje niezdefiniowane metody i wywoluje odpowiedni klucz z tablicy
  108.   *
  109.   * return String, Int
  110.   */
  111. public function __get($name)
  112. {
  113. if(array_key_exists($name, $this->sessionTable))
  114. return $this->sessionTable[$name];
  115. throw new SessionException('Nie zdefiniowano klucza: '.$name);
  116. }
  117.  
  118.  /**
  119.   * Niszczy sesje dla danego uzytkownika
  120.   *
  121.   */
  122. public function destroy()
  123. {
  124. return db::query('DELETE FROM '.$this->table.' WHERE `id`=''.$this->id.''');
  125. }
  126.  
  127.  /**
  128.   * Zapisuje zserializowane dane do bazy
  129.   *
  130.   */
  131. public function __destruct()
  132. {
  133. db::query('UPDATE '.$this->table.' SET `czas`='.time().', dane=''.serialize($this->sessionTable).'' WHERE `id`=''.$this->id.''');
  134. }
  135. }
  136.  
  137. class SessionException extends Exception {}
  138.  
  139. /* TABELA
  140.  
  141. CREATE TABLE `session` (
  142.   `id` varchar(32) default NULL,
  143.   `czas` int(11) default NULL,
  144.   `dane` longtext,
  145.   UNIQUE KEY `id` (`id`)
  146. ) TYPE=MyISAM;
  147.  
  148.  
  149. */
  150. ?>


No i chciałem się zapytać co sądzicie o takim rozwiązaniu. Muszę jeszcze popracować nad zmniejszeniem ilości zapytań, bo w aktualnej chwili wynoszą średnio one 3.

Pozdrawiam
Go to the top of the page
+Quote Post

Posty w temacie
- Apo   własna obsługa sesji   18.06.2006, 18:43:24
- - Ociu   A nie pożna poprostu użyć session_set_save_handler...   19.06.2006, 14:00:59
- - Kinool   [PHP] pobierz, plaintext <?phpmd5($_SERVER...   19.06.2006, 17:38:32
|- - Apo   Cytat(Kinool @ 19.06.2006, 16:38 ) [PHP] ...   19.06.2006, 17:50:01
- - Ludvik   Jakiś czas temu było wyjaśniane na forum, że nie z...   19.06.2006, 19:50:22
- - Ociu   Myśle, że SID można wygenerować poprzez time() + i...   20.06.2006, 08:20:17
- - Ludvik   Jeżeli dodasz time(), to po sekundzie nie odzyskas...   20.06.2006, 12:39:21
- - bigZbig   Ja sie zastanawiam po co ludzie pisza swoje wlasne...   20.06.2006, 14:10:43
- - Ociu   Ludvik: nikt przecież nie zabronił Ci przechowac S...   20.06.2006, 14:49:34
- - Ludvik   Czytając kod, który napisał Apo, można odczytać je...   20.06.2006, 16:32:41
- - Apo   No ok to chyba bede zapisywał ID w cookies, a...   20.06.2006, 19:33:08
- - NuLL   php samemu dokleja identyfikator sesji.   20.06.2006, 20:38:42
|- - Apo   Cytat(NuLL @ 20.06.2006, 19:38 ) php sam...   20.06.2006, 20:41:53
- - NuLL   Moze wylacz ciastka sobie w browserze i sprawdz co...   20.06.2006, 20:43:19
- - elnino.pl   A co myślicie o następującym rozwi...   25.06.2006, 13:24:59
- - Vengeance   bigZbig: a moze po to by sprawdzic, ilu ludzi jest...   1.07.2006, 22:58:31
- - bigZbig   @Vengeance - zgadzam się, że chcąc czegoś więcej p...   3.07.2006, 07:38:42
- - Vengeance   Ano... ale to już ich problem a nie mój Pytałeś d...   4.07.2006, 20:20:29
- - bigZbig   Teoretycznnie rzecz biorac to moznaby zamiennie uz...   4.07.2006, 23:17:01


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 24.08.2025 - 14:48