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
 
Start new topic
Odpowiedzi
Ludvik
post
Post #2





Grupa: Przyjaciele php.pl
Postów: 698
Pomógł: 3
Dołączył: 28.03.2004
Skąd: Wrocław

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


Jakiś czas temu było wyjaśniane na forum, że nie zrobisz tego bezpiecznie bez ciastek. Po prostu nie da się, bo wszystkie te informacje można nie przemęczając się nadpisać. Ciastka są najbezpieczniejszym sposobem na przenoszenie sesji między żądaniami.
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: 5.10.2025 - 12:37