Drukowana wersja tematu

Kliknij tu, aby zobaczyć temat w orginalnym formacie

Forum PHP.pl _ Artykuły _ Session Handler - Zarządzanie zasobami sesji [kwiateek]

Napisany przez: It's_me 22.03.2004, 20:41:21

Uwagi, pytania zwiazane zwiazane z artykulem autorstwa kwiateek http://www.php.pl/index.php/phppl/artyku_y/aplikacje_internetowe/architektura/session_handler_zarz_dzanie_zasobami_sesji prosze pisac w tym temacie.

Napisany przez: Ive 22.03.2004, 21:03:32

artykuł ciekawy ale wkurzają mnie te przykłady! bo [wg mnie] scroll powinien być tez w dół a nie tylko na boki...

Napisany przez: Siner 23.03.2004, 08:03:53

Takie cos mnie zaistaresowało.

Cytat
....Tzn. że metody metody muszą akceptować poprzez...
(Wiem, zaraz ktos powie że głopot sie czepiam, itak wszyscy bedea wiedzieli oco chodzi, a moim zdaniem stronka, nie powienna zaweirać błęów, ani logicznych, ani składni ani wykonania, szczegolnie gdy jest to vortal lub portal)

A tak to spuer... Troche sie dowiedziałem wiecej na temat sesji

Napisany przez: It's_me 23.03.2004, 08:06:09

nie sadze aby ktos powiedzial ze sie czepiasz wlasnie po to jest link w arcie aby sie wypowiedziec :-)

[b]DONE

Napisany przez: wojtek 23.03.2004, 17:37:07

To moze i ja dodam klilka bledow, ktory znalazlem podczas lektury tekstu:

Cytat
W PHP4 została wprowadzona obsługa session handler'a. Umożliwiło to nam - programistą php


albo

Cytat
Ogólnie rzecz biorąc zastosowanie session handler'a znajdzie zastosowanie


dalej

Cytat
odświerzenia strony przez użytkownika sprawdza czy nie minął określony czas po którym zaliczy dane odświerzenie


i znowu "ą"

Cytat
Nie były sprostać takim sytuacją jak ta.


Ogolnie jednak artykul ciekawy, imho bardzo dobry temat no i wykonanie zreszta tez.. Oby wiecej takich na php.pl :-)

Napisany przez: kwiateek 23.03.2004, 19:11:57

Czytałem swój tekst przynajmniej kilkanaście razy jednak jak widać czytając swoje nie myśli się o poprawności. Dzięki za zwrócenie uwagi w nastepnych częściach będę uważniejszy.

Pozdrawiam.

Napisany przez: shima 23.03.2004, 19:31:09

Sugeruję użyć narzędzi do sprawdzania pisowni. Jest prościej smile.gif

Napisany przez: scanner 23.03.2004, 19:56:04

Artykuł został zaktualizowany.
Poprawiono wszystkie znalezione literówki.

Napisany przez: KirkoR 10.04.2004, 16:26:06

Dopiero zaczynam zabawę z programowaniem obiektowym i przetrzymywaniem sesji w bazie więc mam kilka pytań.

Pierwsze: dlaczego sesje po wygaśnięciu nie zostają usuwane z bazy? To jest wina skryptu czy może moja? Albo może one są usuwane po pewnym czasie?

Drugie: jak dodawać/pobierać/modyfikować/usuwać dane z tabeli komórki session_value?

Napisany przez: kwiateek 12.04.2004, 11:40:19

Cytat
Pierwsze: dlaczego sesje po wygaśnięciu nie zostają usuwane z bazy? To jest wina skryptu czy może moja? Albo może one są usuwane po pewnym czasie?

Zostają. Odpowiedzialna jest za to metoda
  1. <?php
  2. function _gc($session_lifetime)
  3. ?>

Cytat
Drugie: jak dodawać/pobierać/modyfikować/usuwać dane z tabeli komórki session_value?

W taki sam sposób jak byś to robił normalnie. Czyli w zależności od wersji:
  1. <?php
  2. $_SESSION
  3. ?>

lub
  1. <?php
  2. http://www.php.net/session_register();
  3. ?>

Po szczegóły zapraszam do manuala.

Pozdrawiam.

Napisany przez: matid 12.04.2004, 16:28:16

Jakie dyrektywy muszą być ustawione w php.ini aby obsługa sesji w bazie danych działała ? Bo miałem problem z tym na moim serwerze i zastanawiam się, co jest przyczyną. Objawiało się to w ten sposób, że sesja nie pojawiała się w bazie danych, lecz na localu skrypt działał bez problemu.

Napisany przez: kwiateek 13.04.2004, 06:35:02

Cytat
Jakie dyrektywy muszą być ustawione w php.ini aby obsługa sesji w bazie danych działała ? Bo miałem problem z tym na moim serwerze i zastanawiam się, co jest przyczyną. Objawiało się to w ten sposób, że sesja nie pojawiała się w bazie danych, lecz na localu skrypt działał bez problemu.

Cytat
Notatka:  W swoim pliku php.ini musisz ustawić opcję konfiguracji session.save_handler na user aby session_set_save_handler() zadziałało.

więcej: http://www.php.net/manual/pl/function.session-set-save-handler.php
Pozdrawiam.

Napisany przez: matid 19.04.2004, 19:31:24

O takich podstawach pamiętam, nie zadawałbym pytania gdyby to było takie proste. Jak ktoś chce phpinfo() do wglądu to mogę podać.

Napisany przez: kwiateek 20.04.2004, 20:25:31

Cytat
O takich podstawach pamiętam, nie zadawałbym pytania gdyby to było takie proste. Jak ktoś chce phpinfo() do wglądu to mogę podać.

Podaj link do tego phpinfa. Nie tyle do samego skryptu tylko do już wygenerowanego.

Pozdrawiam.

Napisany przez: letus 7.05.2004, 20:27:31

Witam!. Uruchomiłem ten skrypt u siebie na serwerze i wystąpiły małe komplikacje. Przy wchodzeniu na stronę do bazy zostaje wstawiony nowy rekord sesji, ale przy kolejny wejściu, odświeżeniu strony zamiast zaktualizowanego rekordu wstawiony jest nowy z tym samym id ale start i time maja nowe wartości przyczym start=time. Wie ktoś może czy problem jest po stronie mojego serwera czy skryptu?

Napisany przez: matid 7.05.2004, 20:38:02

Cytat
Podaj link do tego phpinfa. Nie tyle do samego skryptu tylko do już wygenerowanego.

Pozdrawiam.

http://seishi.net/phpinfo.php

Napisany przez: kwiateek 10.05.2004, 19:12:52

Cytat
Witam!. Uruchomiłem ten skrypt u siebie na serwerze i wystąpiły małe komplikacje. Przy wchodzeniu na stronę do bazy zostaje wstawiony nowy rekord sesji, ale przy kolejny wejściu, odświeżeniu strony zamiast zaktualizowanego rekordu wstawiony jest nowy z tym samym id ale start i time maja nowe wartości przyczym start=time. Wie ktoś może czy problem jest po stronie mojego serwera czy skryptu?

Nowe rekordy tworzone są tylko wtedy kiedy sesja wymarła. Żeby nie pozowlić tworzyć rekordów o tym samym ID zrób pdate tabeli SQL:
  1. ALTER TABLE `sessions` ADD UNIQUE (
  2. `session_id`
  3. )

Poprawię to w nowej wersji artykułu.
Cytat
http://seishi.net/phpinfo.php

Nie widzę w phpinfo() żadnych róznic w stosunku do mojego.
Spróbuj ustawić error_reporting na:
  1. <?php
  2. http://www.php.net/error_reporting(E_ALL);
  3. ?>

przy wywołaniu skryptu i może przechwycisz jakieś błędy.

Pozdrawiam.

Napisany przez: hup 29.05.2004, 21:11:27

zastosowanie klasy opsianej w artukule czas generowania strony to [ czas wykonania skryptu: 4.00552 ], natomiast wykonanie tego funkcyjnie: http://php.webhelp.pl/index.php?id=116&roz=php&ac=read to czas rzedu: [ czas wykonania skryptu: 0.00024 ]. czy programowanie obiektowe moze dac az taki narzut czasowy, czy klasa jest nieprawidlowo napisana?

[php:1:5bdccf2715]<?php
$connect = ... $this->db_config['pass'])
?>[/php:1:5bdccf2715] - po poprawnieniu bledu czas wykonaniua to: [ czas wykonania skryptu: 0.50286 ], poszukiwania bledow trwaja...

ps. czasy podane sa w sekundach.

Napisany przez: kwiateek 31.05.2004, 06:45:00

Cytat
[php:1:8c019c05a8]<?php
$connect = ... $this->db_config['pass'])
?>[/php:1:8c019c05a8] - po poprawnieniu bledu czas wykonaniua to: [ czas wykonania skryptu: 0.50286 ], poszukiwania bledow trwaja...

Jakiego błędu? Napisz dokładnie o czym mowa bo nie rozumiem.
U mnie czas generowania tej klasy wynosi około 0.0019 sec.

Pozdrawiam.

Napisany przez: FastRed 31.05.2004, 13:25:55

Kod
$this->db_config['password'] = $db_config['password'];


Kod
$connect = @$connect_type($this->db_config['host'], $this->db_config['user'], $this->db_config['pass']);

Zapewne o to się rozchodzi

Napisany przez: hup 31.05.2004, 17:10:56

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] ?

Napisany przez: kwiateek 31.05.2004, 20:17:21

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.

Napisany przez: DeyV 31.05.2004, 20:35:47

poprawione

Napisany przez: hup 31.05.2004, 22:10:59

_gc dziala po zmianie:

  1. <?php
  2. function _gc($session_lifetime) {
  3. $session_lifetime = http://www.php.net/time() - $this->session_lifetime;
  4. $sql_query = (&#092;"DELETE FROM \" . $this->session_table . \" WHERE session_time < \" . $session_lifetime . \";\"); 
  5. $result = @http://www.php.net/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

Napisany przez: Bartosław 21.08.2004, 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

Napisany przez: itsme 22.08.2004, 07:15:25

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

Napisany przez: kwiateek 23.08.2004, 19:24:16

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.

Napisany przez: anas 22.12.2004, 19:41:54

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 http://www.php.net/static $dbConfig = http://www.php.net/array();
  11.  
  12. /**
  13. * Tabela z danymi sesyjnymi
  14. * @var string $sessionTable - Ustawiana przez konstruktor @see __construct();
  15. * @access private
  16. */
  17. private http://www.php.net/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 http://www.php.net/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. http://www.php.net/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,http://www.php.net/array($this->sessionTable, $sessionID, http://www.php.net/time(), http://www.php.net/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,http://www.php.net/array($this->sessionTable, http://www.php.net/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,http://www.php.net/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 = http://www.php.net/time() - $this->sessionLifetime;
  210. $stmt = $this->dbConnection->Prepare('DELETE FROM ? WHERE sessionTime < ?');
  211.  
  212. if($this->dbConnection->Execute($stmt,http://www.php.net/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. http://www.php.net/session_set_save_handler (http://www.php.net/array(&$session, '_open'), 
  20. http://www.php.net/array(&$session, '_close'), 
  21. http://www.php.net/array(&$session, '_read'), 
  22. http://www.php.net/array(&$session, '_write'), 
  23. http://www.php.net/array(&$session, '_destroy'), 
  24. http://www.php.net/array(&$session, '_gc')
  25.  );
  26.  
  27. http://www.php.net/session_start();
  28. http://www.php.net/session_register('dupa');
  29.  
  30. if($_GET['action'] == 'check')
  31. {
  32. http://www.php.net/echo $_SESSION['dupa'];
  33. }
  34.  
  35. ?>
  36.  
  37. <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

Napisany przez: Mery 9.03.2005, 12: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 ?

Napisany przez: PUPI 10.03.2005, 01:05:59

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.

Napisany przez: Fallout 6.05.2005, 03:52:08

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 http://www.php.net/die(&#092;"Nieee\");
  7.  $this->p = $connect;
  8.  $db_select = http://www.php.net/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 = http://www.php.net/time() - $this->session_lifetime;
  6.  $sql_query = &#092;"DELETE FROM \" . $this->session_table . \"
  7.  WHERE session_time < &#092;" . time() - $session_lifetime . \"\";
  8.  $result = @http://www.php.net/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. http://www.php.net/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

Napisany przez: AxZx 9.07.2005, 23:47:05

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

Napisany przez: no_face 13.09.2007, 10:22:44

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. http://www.php.net/session_set_save_handler (http://www.php.net/array(&$session, '_open'),
  3. http://www.php.net/array(&$session, '_close'),
  4. http://www.php.net/array(&$session, '_read'),
  5. http://www.php.net/array(&$session, '_write'),
  6. http://www.php.net/array(&$session, '_destroy'),
  7. http://www.php.net/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 = http://www.php.net/time();
  49. $session_time = http://www.php.net/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 = http://www.php.net/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. http://www.php.net/session_set_save_handler (http://www.php.net/array(&$session_go, '_open'),
  95. http://www.php.net/array(&$session_go, '_close'),
  96. http://www.php.net/array(&$session_go, '_read'),
  97. http://www.php.net/array(&$session_go, '_write'),
  98. http://www.php.net/array(&$session_go, '_destroy'),
  99. http://www.php.net/array(&$session_go, '_gc'));
  100.  
  101. http://www.php.net/session_start();
  102. ?>

Napisany przez: nospor 20.03.2008, 12:05:20

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

Napisany przez: _olo_1984 18.07.2008, 08:38:38

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)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)