Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V  < 1 2  
Reply to this topicStart new topic
> Session Handler - Zarządzanie zasobami sesji [kwiateek]
hup
post 31.05.2004, 17:10:56
Post #21





Grupa: Zarejestrowani
Postów: 15
Pomógł: 0
Dołączył: 10.02.2004

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


komu dziala _gc? skad klasa "wie" jaki jest lifetime. nie brakuje moze linijiki [php:1:c3840c21d6]<?php
$this->session_lifetime = $session_lifetime;
?>[/php:1:c3840c21d6] ?
Go to the top of the page
+Quote Post
kwiateek
post 31.05.2004, 20:17:21
Post #22





Grupa: Zarejestrowani
Postów: 223
Pomógł: 0
Dołączył: 13.01.2003
Skąd: 3rd ball of mud behind a big ball of burning gas

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


Cytat
komu dziala _gc? skad klasa "wie" jaki jest lifetime. nie brakuje moze linijiki [php:1:e7503a3196]<?php
$this->session_lifetime = $session_lifetime;
?>[/php:1:e7503a3196] ?

Jak widać brakuje. Trzeba ją wrzucić do konstruktora. Niech ktoś z redakcji kto ma uprawnienia do artów to poprawki.

Pozdrawiam.


--------------------
It's Time to Join the PLD Linux Generation!
<? while (!$success) { $try++; } ?>
Go to the top of the page
+Quote Post
DeyV
post 31.05.2004, 20:35:47
Post #23





Grupa: Zarząd
Postów: 2 277
Pomógł: 6
Dołączył: 27.12.2002
Skąd: Wołów/Wrocław




poprawione


--------------------
"Niezależnie od tego, jakie masz osiągnięcia, ktoś Ci pomaga..."
Go to the top of the page
+Quote Post
hup
post 31.05.2004, 22:10:59
Post #24





Grupa: Zarejestrowani
Postów: 15
Pomógł: 0
Dołączył: 10.02.2004

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


_gc dziala po zmianie:
  1. <?php
  2. function _gc($session_lifetime) {
  3. $session_lifetime = time() - $this->session_lifetime;
  4. $sql_query = (&#092;"DELETE FROM \" . $this->session_table . \" WHERE session_time < \" . $session_lifetime . \";\"); 
  5. $result = @mysql_query($sql_query);
  6. ?>

bez tej zmiany silnik bazy danych byl odpytywany zapytaniem ktore zawsze zwracalo false. time() - $session_lifetime dawalo w wyniku -$session_lifetime.

pozdrawiam
Go to the top of the page
+Quote Post
Bartosław
post 21.08.2004, 22:06:16
Post #25





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 7.10.2002
Skąd: Wrocław

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


Dzięki wielkie za ten artykuł! Jest super.
Ale... jak w poście powyżej - _gc trzeba lekko zmodyfikować aby działało a mimo że Hup pisał o tym już w maju (a jest teraz sierpień!!!) nikt tego nie poprawił sad.gif

Pozdrawiam
Bartek
Go to the top of the page
+Quote Post
itsme
post 22.08.2004, 07:15:25
Post #26





Grupa: Zarząd
Postów: 1 512
Pomógł: 2
Dołączył: 22.04.2002
Skąd: Koszalin




Cytat(Bartosław @ 2004-08-21 22:06:16)
Dzięki wielkie za ten artykuł! Jest super.
Ale... jak w poście powyżej -  _gc trzeba lekko zmodyfikować aby działało a mimo że Hup pisał o tym już w maju (a jest teraz sierpień!!!)  nikt tego nie poprawił sad.gif

Pozdrawiam
Bartek

nie pytaj sie co my mozemy zrobic dla Ciebie lecz co Ty mozesz zrobic dla nas a w tym dla innych jezeli czegos oczekujesz zadaj sobie pytanie - a moze sam to zrobie?

to nic strasznego .... wystarczy napisac i wyslac


--------------------
brak sygnaturki rowniez jest sygnaturką
Go to the top of the page
+Quote Post
kwiateek
post 23.08.2004, 19:24:16
Post #27





Grupa: Zarejestrowani
Postów: 223
Pomógł: 0
Dołączył: 13.01.2003
Skąd: 3rd ball of mud behind a big ball of burning gas

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


Cytat(Bartosław @ 2004-08-21 23:06:16)
Dzięki wielkie za ten artykuł! Jest super.
Ale... jak w poście powyżej - _gc trzeba lekko zmodyfikować aby działało a mimo że Hup pisał o tym już w maju (a jest teraz sierpień!!!) nikt tego nie poprawił sad.gif

Pozdrawiam
Bartek

hup podał rozwiązanie - czytaj uważnie archiwalne posty. Jakoże nie mam dostepu do panelu administracyjnego nie jestem w stanie dokonać tej poprawki.

Pozdrawiam.


--------------------
It's Time to Join the PLD Linux Generation!
<? while (!$success) { $try++; } ?>
Go to the top of the page
+Quote Post
anas
post 22.12.2004, 19:41:54
Post #28





Grupa: Zarejestrowani
Postów: 172
Pomógł: 0
Dołączył: 22.09.2002
Skąd: Gorzów Wlkp

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


Witam wszystkich

Wczoraj naszło mnie żeby przepisać klasę kwiatka do PHP5 z kilkoma modyfikacjami(np. uzycie adodb do połączenia z bazą). Wszystko szło jak należy do momentu kiedy miałem użyć tego co stworzyłem. Zastosowanie klasy nie przynosi rezultatów. Sesje nie są zapisywane - jedyne co mi wywala php, to taki warning:

Kod
Warning: Unknown: Your script possibly relies on a session side-effect which existed until php 4.2.3. Please be advised that the session extension does not consider global variables as a source of data, unless register_globals is enabled. You can disable this functionality and this warning by setting session.bug_compat_42 or session.bug_compat_warn to off, respectively. in Unknown on line 0


Pierwszy raz widzę coś takiego - ktoś ma pomysł co może powodować takie ostrzeżenie?

Oto kod klasy handlera:

  1. <?php
  2.  
  3. class SessionHandler
  4. {
  5. /**
  6. * Dane konfiguracyjne serwera bazy danych - do polączenia.
  7. * @var array $dbConfig - Ustawiane przez konstruktor @see __construct();
  8. * @access private
  9. */
  10. private static $dbConfig = array();
  11.  
  12. /**
  13. * Tabela z danymi sesyjnymi
  14. * @var string $sessionTable - Ustawiana przez konstruktor @see __construct();
  15. * @access private
  16. */
  17. private static $sessionTable; 
  18.  
  19. /**
  20. * Zmienna przechowujaca czas zycia sesji  
  21. * @var int $sessionLifetime - Ustawiana przez konstruktor @see __construct();
  22. * @access private
  23. */
  24. private $sessionLifetime;
  25.  
  26. /**
  27. * Zmienna przechowujaca instancje abstrakcji bazy, posluzy do komunikacji z
  28. baza.  
  29. * @var Creole $dbConnection
  30. * @access private
  31. */
  32. private static $dbConnection;  
  33.  
  34. /**
  35. * Konstruktor klasy SessionHandler
  36. * Przygotowanie polaczenia ze baza danych i okreslenie parametrow wstepnych
  37.  
  38. * @param array $dbConfig - Dane konfiguracyjne bazy.
  39. * @param string $sessionTable - nazwa tabeli przechowującej dane sesji. 
  40. * @param int $sessionLifetime - Maksymalny czas istnienia nieaktywnej sesji. 
  41. * @return void 
  42. * @access public 
  43. */  
  44. public function __construct($dbConfig = false, $sessionTable = false, $sessionLifetime = 0) 
  45. {
  46. if($dbConfig AND $sessionTable)
  47. {
  48. /*
  49. * Dane do polaczenia z baza danych.
  50. */
  51. $this->dbConfig['type']  = $dbConfig['type'];
  52. $this->dbConfig['host']  = $dbConfig['host'];
  53. $this->dbConfig['username'] = $dbConfig['user'];
  54. $this->dbConfig['password'] = $dbConfig['password'];
  55. $this->dbConfig['database'] = $dbConfig['database'];
  56.  
  57. /*
  58. * Pozostale dane konfiguracyjne - nazwa tabeli przechowujacej dane sesji
  59. * oraz czas okreslajcy zycie sesji.
  60. */
  61. $this->sessionTable = $sessionTable;
  62. $this->sessionLifetime = $sessionLifetime; 
  63.  
  64. /*
  65. * Stala przechowujaca sciezke do abstrakcji DB
  66. */
  67. define('DB_ABSTRACT_PATH', 'adodb/adodb.inc.php'); 
  68. }
  69. else 
  70. {
  71. // error_handler();
  72. }
  73. }
  74.  
  75. /**
  76. * Nawiązywanie połączenia bazodanowego
  77. * @return bool 
  78. * @access private 
  79. */ 
  80. private function dbConnect() 
  81. {
  82. if(require_once(DB_ABSTRACT_PATH))
  83. {
  84. $this->dbConnection = &ADONewConnection($this->dbConfig['type']); 
  85. $this->dbConnection->PConnect($this->dbConfig['host'], $this->dbConfig['username'],
  86. $this->dbConfig['password'], $this->dbConfig['database']);
  87. return true;
  88. }  
  89. else
  90. {
  91. return false;
  92. }
  93. }
  94.  
  95. /**
  96. * Inicjalizacja sesji 
  97. * @param string $sesion_savepath Lokalizacja zapisu sesji
  98. * @param string $session_name Nazwa sesji 
  99. * @return bool 
  100. * @access private 
  101. */ 
  102. public function _open($session_savepath, $session_name) 
  103. {
  104. if($this->dbConnect()) 
  105. {
  106. return true;
  107. }
  108. }
  109.  
  110. /**
  111. * Zakończenie sesji
  112. * @return bool 
  113. * @access private 
  114. */ 
  115. public function _close()
  116. {
  117. if($this->_gc())
  118. {
  119. return true;
  120. }
  121. else 
  122. {
  123. return false;
  124. }
  125. } 
  126.  
  127. /**
  128. * Odczytywanie danych sesyjnych
  129. * @param string $sessionID - Identyfikator sesji
  130. * @return mixed
  131. * @access public 
  132. */ 
  133.  
  134. public function _read($sessionID) 
  135. {
  136. //$stmt = $this->dbConnection->Prepare('SELECT sessionValue FROM ? WHERE sessionID = ?');
  137. //$rs = $this->dbConnection->Execute($stmt,array($this->sessionTable, $sessionID));
  138.  
  139. if($array = $this->dbConnection->GetAssoc(&#092;"SELECT sessionValue FROM \".$this->sessionTable.\" WHERE sessionID = \".$sessionID))
  140. {
  141. return($array['sessionValue']);
  142. }
  143. else 
  144. {
  145. return false;
  146. }
  147. }
  148.  
  149. /**
  150. * Zapisywanie danych sesji
  151. * @param string $sessionID Identyfikator sesji
  152. * @param string $sessionValue Wartości sesyjne
  153. * @return bool
  154. * @access public 
  155. */ 
  156.  
  157. public function _write($sessionID, $sessionValue) 
  158. {
  159.  
  160. $stmt = $this->dbConnection->Prepare('INSERT INTO ? VALUES(?,?,?,?)');
  161.  
  162. if($this->dbConnection->Execute($stmt,array($this->sessionTable, $sessionID, time(), time(), $sessionValue))) 
  163. {
  164. return true;
  165. } 
  166. else 
  167. {
  168. $stmt = $this->dbConnection->Prepare('UPDATE ? SET sessionTime = ?, sessionValue = ? WHERE sessionID = ?'); 
  169.  
  170. if($this->dbConnection->Execute($stmt,array($this->sessionTable, time(), $sessionValue, $sessionID))) 
  171. {
  172. return true;
  173. } 
  174. else 
  175. {
  176. return false;
  177. } 
  178. }
  179. } 
  180.  
  181. /**
  182. * Usuwanie danych sesji
  183. * @param string $sessionID - Identyfikator sesji
  184. * @return bool
  185. * @access public 
  186. */ 
  187.  
  188. function _destroy($sessionID) 
  189. {
  190. $stmt = $this->dbConnection->Prepare('DELETE FROM ? WHERE sessionID = ?'); 
  191.  
  192. if($this->dbConnection->Execute($stmt,array($this->sessionTable, $sessionID))) 
  193. {
  194. return true;
  195. } 
  196. else 
  197. {
  198. return false;
  199. } 
  200. } 
  201.  
  202. /**
  203. * \"Garbage collection\" - Usuwanie niepotrzebnych danych sesji
  204. * @return bool
  205. * @access public
  206. */ 
  207. function _gc() 
  208. {
  209. $sessionDeletetime = time() - $this->sessionLifetime;
  210. $stmt = $this->dbConnection->Prepare('DELETE FROM ? WHERE sessionTime < ?');
  211.  
  212. if($this->dbConnection->Execute($stmt,array($this->sessionTable, $sessionDeletetime))) 
  213. {
  214. return true;
  215. } 
  216. else 
  217. {
  218. return false;
  219. } 
  220. } 
  221. }
  222. ?>


a to sposób użycia:

  1. <?php
  2.  
  3. include(&#092;"SessionHandler.class.php\");
  4.  
  5. $dupa = 15;
  6.  
  7. $db_config['type'] = 'mysql';
  8. $db_config['host'] = 'host';
  9. $db_config['user']= 'user';
  10. $db_config['password'] = 'pass';
  11. $db_config['datebase'] = 'db';
  12.  
  13. // Tworzenie obiektu zarządzania sesją
  14.  
  15. $session = new SessionHandler($db_config, 'sessions', 300);
  16.  
  17. // Zastępowanie domyślnych funkcji metodami sesji
  18.  
  19. session_set_save_handler (array(&$session, '_open'), 
  20. array(&$session, '_close'), 
  21. array(&$session, '_read'), 
  22. array(&$session, '_write'), 
  23. array(&$session, '_destroy'), 
  24. array(&$session, '_gc')
  25.  );
  26.  
  27.  
  28. if($_GET['action'] == 'check')
  29. {
  30. echo $_SESSION['dupa'];
  31. }
  32.  
  33. ?>
  34.  
  35. <a href='session.php?action=check'>test</a>


Dodam, że w bazie danych też nie ma żadnych rekordów.

Co o tym myślicie - z góry dzięki za wskazówki.

pozdrawiam

anas
Go to the top of the page
+Quote Post
Mery
post 9.03.2005, 12:56:38
Post #29





Grupa: Zarejestrowani
Postów: 17
Pomógł: 0
Dołączył: 18.01.2004
Skąd: Ostrów Wlkp.

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


U mnie pojawił się taki problem. Nie wiem czy nie mieszam, bo wydaje mi się to dziwne no ale tak jest.

Mianowicie przy kazdym wywołaniu session_start() najpierw wywoływana jest metoda _write, która zapisuje nową datę do bazy, a dopiero później sprawdzane jest czy sesja się nie przedawniła metodą _gc.

Przez to najpierw nadpisywana jest nowa data, wiec sesja nigdy sie nie przedawnia.

Gdy we _write zanim zostanie zupdatowany rekord w baze dodałem wywołanie _close, która wywołuje _gc to wszystko wydaje się działać dobrze.

Czy to jest normalne questionmark.gif Czy to może wina serwera, że najpierw updatuje, a poźniej sprawdza dopiero czy powinien questionmark.gif

ps korzystam z wersji z artukułu, nie tej dostosowanej do php5

EDIT: a jeszcze lepiej gdy dodałem wywołanie _gc w metodzie _read, wtedy sprawdza czy sesja nie jest przedawniona zanim jeszcze cokolwiek z niej wczyta.

Ale czy tak nie powinno być normalnie ?

Ten post edytował Mery 9.03.2005, 17:32:22
Go to the top of the page
+Quote Post
PUPI
post 10.03.2005, 01:05:59
Post #30





Grupa: Zarejestrowani
Postów: 69
Pomógł: 5
Dołączył: 6.02.2004
Skąd: Bydgoszcz

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


Cytat
bool gc ( int session_lifetime );

Funkcja ta jest odpowiedzialna za usuwanie już nieużywanych zasobów (w slangu nazywamy to: garbage collection). Do nieużywanych zasobów zaliczają się stare, nieaktywne sesje. Ta funkcja wywoływana jest przez funkcję close. Maksymalny czas trwania sesji przekazywany w postaci parametru tej funkcji definiuje po jakim czasie sesje mają być uznane za nieaktywne i czyszczone przez tą funkcję. Odpowiednikiem tego parametru w pliku konfiguracyjnym php.ini jest wpis: session.gc_probability.


Czy w ostatnim zdaniu nie chodziło o "session.gc_maxlifetime" ?
session.gc_probability wpływa na prawdopodobieństwo wykonywania funkcji gc.


--------------------
Go to the top of the page
+Quote Post
Fallout
post 6.05.2005, 03:52:08
Post #31





Grupa: Zarejestrowani
Postów: 154
Pomógł: 0
Dołączył: 17.12.2003
Skąd: Olsztyn

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


Witam

Zostałem odesłany do tego skryptu, więc go wkleiłem.. no i nici... po jakieś godzinie (jak nie więcej)

1) Po pierwsze (poruszone w temacie)

  1. <?php
  2.  function connection()
  3.  {
  4.  // Typ połączenia
  5.  $connect_type = $this->db_config['persistent'] ? 'mysql_pconnect' : 'mysql_connect';
  6.  $connect = $connect_type($this->db_config['host'], $this->db_config['user'], $this->db_config['password']) or Die(&#092;"Nieee\");
  7.  $this->p = $connect;
  8.  $db_select = mysql_select_db ($this->db_config['datebase']);
  9.  
  10.  if ($connect && $db_select) {
  11.  return true;
  12.  } else {
  13.  return false;
  14.  }
  15.  }
  16. ?>


oraz

  1. <?php
  2.  
  3.  function _gc($session_lifetime)
  4.  {
  5.  $session_lifetime = time() - $this->session_lifetime;
  6.  $sql_query = &#092;"DELETE FROM \" . $this->session_table . \"
  7.  WHERE session_time < &#092;" . time() - $session_lifetime . \"\";
  8.  $result = @mysql_query($sql_query,$this->p);
  9.  if ($result) {
  10.  return true;
  11.  } else {
  12.  return false;
  13.  }
  14.  }
  15.  
  16. ?>


2) Po drugie

Za cholerę nie chciało mi się zalogować do bazy sql, kombinowałem, normalnie zrobiłem ręczne debuggowanie smile.gif i doszłem do wniosku że trzeba w klasie zrobić coś takiego

  1. <?php
  2. var $p; 
  3. ?>


potem w funkcji Connection

  1. <?php
  2. $this->p = $connect;
  3. ?>


a nastepnie kazde mysql_query($sql_query) zmienic na
  1. <?php
  2. mysql_query($sql_query,$this->p)
  3. ?>


no i skrypt ruszył...

potem namęczyłem bo coś mi ze starych $_SESSION nie chciało łapać.. no ale koniec końców jakoś sie udało...

Niby niewielkie zmiany ale znaim do nich doszlem to myślałem że wybuchne...

mam wrażenie, że kod był pisany na sucho, bez testów.. co nie zmienia faktów, że działa i, że się napewno przyda...

pozdrawiam

Ten post edytował Fallout 6.05.2005, 03:53:18


--------------------
Go to the top of the page
+Quote Post
AxZx
post 9.07.2005, 23:47:05
Post #32





Grupa: Zarejestrowani
Postów: 1 385
Pomógł: 55
Dołączył: 1.03.2005
Skąd: śląsk

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


witam

dziekuje Kwiatkowi za udostepnie tej klasy smile.gif
mam kilka pytan odnosnie session handler
czy zawsze lepiej stosowac session handler w mysql czy tylko wtedy gdy chce zliczac userow obecnie przebywajacyh na stronie, w konkretnym dziale itd.

czy ten session handler dziala w taki sposob ze user zamyka przegladarke, a nastepnie znowu wlacza i wchodzi na ta sama strone i znowu jest zalogowany?

dlaczego jak w jednym oknie przegladarki jestem zalogowany, otwieram drugie okno przegladarki i tez jestem zalogowany? czy to wina mojego skryptu czy tak ma dzialac session handler na mysql i to jest wlasnie ten czas zycia sesji?

do zliczania klikniec, wejsc na strone, itp, lepiej stosowac session handler czy mozna zwykle sesje w plikach?

bo obawiam sie ze nie bede mogl zmieniec tego wpisu odnosnie session_handler na serwerze.

dziekuje za cierpliwosc, wyrozumialosc i dobre odpowiedzi
dobranoc


--------------------
aplikacje internetowe | Symfony
Go to the top of the page
+Quote Post
no_face
post 13.09.2007, 10:22:44
Post #33





Grupa: Zarejestrowani
Postów: 346
Pomógł: 23
Dołączył: 28.11.2004

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


Widze, ze dosc ciekawa rozmowa byla tutaj prowadzona, lecz raptownie zakonczona, dlatego tez pozwole sobie odgrzac ten tamet, gdyz wydaje mi sie bardzo interesujacy, a pisac kolejnych nie ma sensu.

Po pierwsze sprawa braku usuwania sesji w bazie:
Cytat(Mery @ 9.03.2005, 11:56:38 ) *
U mnie pojawił się taki problem. Nie wiem czy nie mieszam, bo wydaje mi się to dziwne no ale tak jest.

Mianowicie przy kazdym wywołaniu session_start() najpierw wywoływana jest metoda _write, która zapisuje nową datę do bazy, a dopiero później sprawdzane jest czy sesja się nie przedawniła metodą _gc.

Przez to najpierw nadpisywana jest nowa data, wiec sesja nigdy sie nie przedawnia.

Gdy we _write zanim zostanie zupdatowany rekord w baze dodałem wywołanie _close, która wywołuje _gc to wszystko wydaje się działać dobrze.

Czy to jest normalne questionmark.gif Czy to może wina serwera, że najpierw updatuje, a poźniej sprawdza dopiero czy powinien questionmark.gif

ps korzystam z wersji z artukułu, nie tej dostosowanej do php5

EDIT: a jeszcze lepiej gdy dodałem wywołanie _gc w metodzie _read, wtedy sprawdza czy sesja nie jest przedawniona zanim jeszcze cokolwiek z niej wczyta.

Ale czy tak nie powinno być normalnie ?

i to jest prawda, w takiej sytuacji u mnie nigdy nie dochodzilo do sytuacji by sesja z bazy zostala usunieta. Dodalem _gc do mtody _read przez co zaczelo usuwac sesje z bazy.

Mysle, ze nie tylko mi sie przydaly odpowiedzi na pytania poruszone przez autora poprzedniego posta:
Cytat(AxZx @ 9.07.2005, 22:47:05 ) *
czy zawsze lepiej stosowac session handler w mysql czy tylko wtedy gdy chce zliczac userow obecnie przebywajacyh na stronie, w konkretnym dziale itd.

czy ten session handler dziala w taki sposob ze user zamyka przegladarke, a nastepnie znowu wlacza i wchodzi na ta sama strone i znowu jest zalogowany?

dlaczego jak w jednym oknie przegladarki jestem zalogowany, otwieram drugie okno przegladarki i tez jestem zalogowany? czy to wina mojego skryptu czy tak ma dzialac session handler na mysql i to jest wlasnie ten czas zycia sesji?

do zliczania klikniec, wejsc na strone, itp, lepiej stosowac session handler czy mozna zwykle sesje w plikach?


Teraz moje problemy. Zaladowanie klasy i zastapienie podstawowych metod dla session, kodem:
  1. <?php
  2. session_set_save_handler (array(&$session, '_open'),
  3. array(&$session, '_close'),
  4. array(&$session, '_read'),
  5. array(&$session, '_write'),
  6. array(&$session, '_destroy'),
  7. array(&$session, '_gc'));
  8. ?>

Powinno odbyc sie tylko raz, na poczatku? U mnie przy zamieszczeniu tego na kazdej stronie pokazuje komunikac dotyczacy, ze nie moge powtornie zdeklarowac klasy.

Kolejne pytanie. Po usunieciu sesji z bazy dostaje nowa o takim samy id przy wlaczonej opcji cookie, tak ma byc?

Z gory dziekuje za wskazowki, ktore z pewnoscia nie tylko mi pomoga.

Pozdrawiam.


Edit


Daje szybka przerobke pod PHP5 i mysqli.


  1. <?php
  2. class Session
  3.  {
  4. var $db_s;
  5. var $session_table; 
  6. var $session_lifetime;
  7.  
  8.  
  9. function __construct($db, $session_table, $session_lifetime = 0) 
  10.  {
  11. $this->db_s = $db;
  12. $this->session_table = $session_table;
  13. $this->session_lifetime = $session_lifetime; 
  14.  }
  15.  
  16. function _open($session_savepath, $session_name) 
  17.  {
  18. return true; 
  19.  }
  20.  
  21. function _close()
  22.  {
  23. $this->_gc($this->session_lifetime);
  24.  
  25. return true;
  26.  } 
  27.  
  28. function _read($session_id) 
  29.  {
  30. $this->_gc($this->session_lifetime);
  31.  
  32. $sql_query = "SELECT session_value FROM " . $this->session_table . " WHERE session_id = '" . $session_id . "'";
  33.  
  34. $result = $this->db_s->query($sql_query);
  35.  
  36. if ($result && $result->num_rows > 0)
  37.  {
  38. $ww = $result->fetch_assoc();
  39. $session_value = $ww['session_value'];
  40.  
  41. return $session_value;
  42.  }
  43. else { return false; } 
  44.  }
  45.  
  46. function _write($session_id, $session_value) 
  47.  {
  48. $session_start = time();
  49. $session_time = time();
  50.  
  51. $sql_query = "INSERT INTO " . $this->session_table . " (session_id, session_start, session_time, session_value) VALUES ('" . $session_id . "', " . $session_start . ", " . $session_time . ", '" . $session_value . "')";
  52. $result = $this->db_s->query($sql_query);
  53.  
  54. if ($result) { return true; }
  55. else
  56.  {
  57. $sql_query = "UPDATE " . $this->session_table . " SET session_time = " . $session_time . ", session_value = '" . $session_value . "' WHERE session_id = '" . $session_id . "'";
  58.  
  59. $result = $this->db_s->query($sql_query); 
  60. if ($result) { return true;}
  61. else { return false; } 
  62.  }
  63.  } 
  64.  
  65. function _destroy($session_id) 
  66.  {
  67. $sql_query = "DELETE FROM " . $this->session_table . " WHERE session_id = '" . $session_id . "'"; 
  68.  
  69. $result = $this->db_s->query($sql_query);
  70.  
  71. if ($result) { return true; }
  72. else { return false; } 
  73.  } 
  74.  
  75. function _gc($session_lifetime) 
  76. {
  77. $session_lifetime = time() - $this->session_lifetime;
  78.  
  79. $sql_query = "DELETE FROM " . $this->session_table . " WHERE session_time < " . $session_lifetime;
  80.  
  81. $result = $this->db_s->query($sql_query);
  82.  
  83. if ($result) { return true; }
  84. else { return false; } 
  85. }
  86.  
  87.  }
  88.  
  89. $session_table = "sessions";
  90. $session_lifetime = 10;
  91.  
  92. $session_go = new Session($db, $session_table, $session_lifetime);
  93.  
  94. session_set_save_handler (array(&$session_go, '_open'),
  95. array(&$session_go, '_close'),
  96. array(&$session_go, '_read'),
  97. array(&$session_go, '_write'),
  98. array(&$session_go, '_destroy'),
  99. array(&$session_go, '_gc'));
  100.  
  101. ?>


Ten post edytował no_face 13.09.2007, 10:29:12
Go to the top of the page
+Quote Post
nospor
post 20.03.2008, 12:05:20
Post #34





Grupa: Moderatorzy
Postów: 36 440
Pomógł: 6290
Dołączył: 27.12.2004




zeby tobie bana na manuala dali to mi sie wierzyc nie chce...
http://dev.mysql.com/doc/refman/5.0/en/use.html
http://dev.mysql.com/doc/refman/5.0/en/grant.html

pomine juz ten szczegol ze autor podal po polsku co robia komendy ktore napisal

edit: widze ze post sie zmyl


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
_olo_1984
post 18.07.2008, 08:38:38
Post #35





Grupa: Zarejestrowani
Postów: 289
Pomógł: 77
Dołączył: 5.08.2006

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


mam problem z tym session handlerem. Przerobiłem sobie ten skrypt pod php5. Problem polega na tym, że nie mogę nawiązac połączenia. Mam klasę do obsługi połączenia
  1. <?php
  2. $sql = mySqlObject;
  3. ?>

objekt tej klasy przekazuję innym klasą np. do obsługi newsów czy zbanowanych w sposób
  1. <?php
  2. $ban = new banObject($sql);
  3. ?>

lub czasami rozszerzam przez extends. Ale to są przykłady. chodzi mi o to że, w żaden sposób nie mogę nawiązać połączenia, tak mi się wydaje, w klasie session. Czyli jeżeli zrobię tak:
  1. <?php
  2. $session = new sessionObject($sql, $lifetime = 300);
  3.  
  4. //lub tak:
  5.  
  6. class sessionObject extends mySqlObject
  7. ?>


to pojawiają się błędy:
1. dla przykładu 1 to
Warning: mysql_query(): 6 is not a valid MySQL-Link resource in ... (w pliku klasy mysql)
Warning: mysql_affected_rows() [function.mysql-affected-rows]: A link to the server could not be established in .. (plik klasy mysql)

2. dla przykładu 2 to
Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sen
Warning: mysql_affected_rows() [function.mysql-affected-rows]: A link to the server could not be established in ...

Dodam, iż klasa mysql jest poprawna, korzystam z niej od dawna. Problem jest z tymi sesjami. Błędów skrypcie nie mam. raportowanie włączone. Co ciekawe, jeżeli rozpiszę sobie tą klasę na zwykłe funkcje, napiszę jeszcze jedną funkcję do łączenia się connect(), taką banalną samo wywołanie połączenia i wybór bazy, i potem w każdej z tych funkcji do obslugi sessji przed zapytaniem wywołam connect() to wszystko ładnie chodzi. Nie mam pojęcia co jest. Nie wiem czy jest sens wrzucać tu moje kody (klasa identyczna tylko ze pod php5 jak tu zaprezentowana niżej).
Wydaje mi się, że sessja nie potrafi korzystać z obiektu połączenia, a obiekt połącznia normalnie działa, gdyż wcześniej pobiera mi ustawienia główne. Nierobiłem jeszcze opcji, że w klasie do obsługi sessji stworzyć funkcję nawiązującą połączenie i z niej korzystać, ale wydaje mi się ze bez tego powinno to działać. Ma ktoś jakieś pomysły ? Bardzo mi zależy bo męcze sie z tym już kilka dni. (jeżeli jest potrzeba to wkleje kody)


--------------------
awake
Go to the top of the page
+Quote Post

2 Stron V  < 1 2
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 Wersja Lo-Fi Aktualny czas: 28.03.2024 - 15:51