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
elnino.pl
post
Post #2





Grupa: Zarejestrowani
Postów: 125
Pomógł: 0
Dołączył: 17.06.2006

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


A co myślicie o następującym rozwiązaniu:

  1. <?php
  2.  
  3. class elSess
  4. {
  5. public $sess_dir = '/tmp/';
  6. public $sess_time = 360;
  7.  
  8. private $key;
  9. private $iv;
  10.  
  11. function elSess()
  12. {
  13. if (!is_writable($this -> sess_dir))
  14. throw new exception('elSess: sess_dir is not writable');
  15. $this -> key = md5($_SERVER['REMOTE_ADDR'] . $_SERVER['HTTP_USER_AGENT']);
  16. $this -> iv = md5($this -> key);
  17. }
  18.  
  19. function elKoduj($string)
  20. {
  21. return base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $this -> key, $string, MCRYPT_MODE_CFB, $this -> iv));
  22. }
  23.  
  24. function elDekoduj($string)
  25. {
  26. return mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $this -> key, base64_decode($string), MCRYPT_MODE_CFB, $this -> iv);
  27. }
  28.  
  29. function _open($session_savepath, $session_name)
  30. {
  31. return true;
  32. }
  33.  
  34. function _close()
  35. {
  36. return true;
  37. }
  38.  
  39. function _read($session_id)
  40. {
  41. if(!file_exists($this -> sess_dir . $session_id))
  42. return '';
  43. $sess_data = $this -> elDekoduj(@file_get_contents($this -> sess_dir . $session_id)) . '';
  44. return($sess_data);
  45. }
  46.  
  47. function _write($session_id, $session_value)
  48. {
  49. return (@file_put_contents($this -> sess_dir . $session_id, $this -> elKoduj($session_value)) && @chmod($this -> sess_dir . $session_id, 0700));
  50. }
  51.  
  52. function _destroy($session_id)
  53. {
  54. return @unlink($this -> sess_dir . $session_id);
  55. }
  56.  
  57. function _gc($session_lifetime)
  58. {
  59. if ($handle = @opendir($this -> sess_dir)) 
  60. {
  61.  while (false !== ($file = readdir($handle)))
  62.  if(@is_file($this -> sess_dir . $file) && @filemtime($this -> sess_dir . $file) < time() - $this -> sess_time)
  63.  @unlink($this -> sess_dir . $file);
  64. @closedir($handle);
  65. return true; 
  66. }
  67. else
  68. return false;
  69. }
  70. };
  71.  
  72. $sess = new elSess;
  73. session_set_save_handler (array(&$sess, '_open'), array(&$sess, '_close'), array(&$sess, '_read'), array(&$sess, '_write'), array(&$sess, '_destroy'), array(&$sess, '_gc'));
  74.  
  75. ?>


Ten post edytował elnino.pl 25.06.2006, 13:42:06
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: 2.10.2025 - 10:38