Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Session handler - gc
Forum PHP.pl > Forum > PHP
tabbi
Witam, czemu po czasie który wyznaczyłem nie usuwaja mi sie rekordy sesji z session handlera?
  1. public function gc($sess_maxlifetime) {
  2.  
  3. $old = (time() - $this->sess_duration);
  4.  
  5. $sql = "DELETE FROM `" . $this->table_name . "` WHERE `access` < " . intval($old) . ";";
  6. $qry = mysql_query($sql);
  7.  
  8. /**
  9.   * You can comment the optimize part, and optimize your tables in an independent way.
  10.   * In fact it's addvised that you do it, especially if you have a hight traffic load.
  11.   */
  12. if (mysql_affected_rows() > 0) { $this->optimize(); }
  13.  
  14. return true;
  15. }


Nawet gdy oznacze sess_duration na 2 sekundy to mi sie nie usuwa.? NIe za bardzo rozumiem czemu to nie działa ?
Athlan
$old = (time() - $this->sess_duration);
Tutaj to ma się nijak do $sess_maxlifetime. Dlatego?

Jeżeli to nie pomoże:
Sprawdź też wynik zapytania.
Zdumpuj zapytanie, co zwraca string, spróbuj wykonać go np. w phpMyAdmin.
Przelicz timestampy.
tabbi
A kiedy odpala ta metoda za kazdym razem gdy wywolujemy klase new Session ? w kontruktorze klasy mam:

session_set_save_handler
Athlan
Kolega sobie chyba kpiny urządza.

Manual:
session_set_save_handler

Parametr $gc typu callback. Nawet przykład jak tego użyć jest na tacy.
tabbi
Może jestem głupi ale tego przykładu naprawde nie potrafie znaleźć
Athlan
Kolego, przekleję Ci:
  1. <?php
  2. function open($save_path, $session_name)
  3. {
  4. global $sess_save_path;
  5.  
  6. $sess_save_path = $save_path;
  7. return(true);
  8. }
  9.  
  10. function close()
  11. {
  12. return(true);
  13. }
  14.  
  15. function read($id)
  16. {
  17. global $sess_save_path;
  18.  
  19. $sess_file = "$sess_save_path/sess_$id";
  20. return (string) @file_get_contents($sess_file);
  21. }
  22.  
  23. function write($id, $sess_data)
  24. {
  25. global $sess_save_path;
  26.  
  27. $sess_file = "$sess_save_path/sess_$id";
  28. if ($fp = @fopen($sess_file, "w")) {
  29. $return = fwrite($fp, $sess_data);
  30. fclose($fp);
  31. return $return;
  32. } else {
  33. return(false);
  34. }
  35.  
  36. }
  37.  
  38. function destroy($id)
  39. {
  40. global $sess_save_path;
  41.  
  42. $sess_file = "$sess_save_path/sess_$id";
  43. return(@unlink($sess_file));
  44. }
  45.  
  46. function gc($maxlifetime)
  47. {
  48. global $sess_save_path;
  49.  
  50. foreach (glob("$sess_save_path/sess_*") as $filename) {
  51. if (filemtime($filename) + $maxlifetime < time()) {
  52. @unlink($filename);
  53. }
  54. }
  55. return true;
  56. }
  57.  
  58. session_set_save_handler("open", "close", "read", "write", "destroy", "gc");
  59.  
  60.  
  61. // proceed to use sessions normally
  62.  
  63. ?>


Funkcja gc() jest w session_set_save_handler jako ostatni argument. Pamiętaj, że jest to typ callback, czyli w Twoim przypadku będzie to nie string, a array($instancja_obiektu_sesji, "gc")
Rid
Nie chcę zakładać nowego tematu.Chciałbym się dowiedzieć czym, się różni Session handler od zwykłej SESSION ,druga rzecz jaki jest czas życia takiej sesji-czy również,trwa do zamknięcia przeglądarki???Czytałem na temat tej sesji:
Cytat
Procedura obsługi "zapisz" nie będzie wywołana dopóki strumień wyjściowy jest otwarty. W związku z tym, wyjście instrukcji debugowania zawartych w procedurze "zapisz" nigdy nie będzie widoczne w oknie przeglądarki. Jeśli konieczne jest wyjście debugowania, sugerowane jest zapisanie tego wyjścia do pliku.
O jaki strumień tutaj chodzi???Zaproponowano mi użycie Session handler jako zabezpieczenia typu:jeden użytkownik na jednym koncie-nie chciałbym aby ,w tym samym czasie użytkowało więcej niż jedna osoba.
Athlan
Session handler służy do napisania własnych mechanizmów przetrzymywania sesji. W takim mechaniźmie możesz właśnie uwzględnić swoje warunki początkowe, które napisałeś.

Session handler NICZYM nie różni się od "zwykłej" SESSION, gdyż jest to tylko mechanizm składowania sesji. Domyślny, zaproponowany przez PHP to składownaie plików w odpowiewniej lokalizacji.
Rid
Dziękuję ,myśle że warto będzie się szerzej zainteresować tą funkcją.Chciałbym się także dowiedzieć ,co to za strumień o który ,piszą w manualu.Jaka jest szansa przechwycenia takiej sesji?questionmark.gif?Używam sesji do podtrzymywania loginu na innych ,podstronach,czy ma sens zabezpieczać sesje przed przechwyceniem inną sesjąquestionmark.gif?
Athlan
Szansa przechwycenia jest identyczna, jak w przypadku normalnego rozwiązania. Pamiętaj, że session_handler to tylko system składowania danych sesji, a nie system całej sesji. Otrzymuje on standardowe dane na temat utworzenia, próby zapisu etc.

Strumień natomiast, to nic innego, jak output. save() wykonuje się po tym, jak pehap wyśle do przeglądarki dane. On nie działa w momencie $_SESSION['klucz'] = 'wartosc'; tylko w momencie, kiedy całość się wykona, wypluje do przeglądarki, a przed tym, jak obiekty otrzymują call na destruktory __destruct(), zmienne są niszczone, etc, etc. Chodzi o to, że jak dasz sobie var_dump() na tablicę sesji w save(), nie zostanie ona wyświetlona, bo nie ma gdzie - output już wyslano, jest zamknięty ; ) Zauważ, że jak w dowolnym momencie skryptu dasz sobie echo, var_dump i inne, od razu otrzymasz wynik (przy nie manipulowaniu buforem). Znaczy to, że strumień jest otwarty.
Rid
Dziękuję za szczegółowe wyjaśnienie,z tego co Pan napisał wnioskuję ,że nie ma sensu zabezpieczać sesje poprzez Session handler jak niektórzy mi doradzali.
Athlan
Odnośnie zabezpieczania sesji:
http://phpsec.org/projects/guide/4.html
Rid
Jest Pan "wielki".Właśnie takiego czegoś szukałem:)Dziękuje bardzo ale to bardzo snitch.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.