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.
artykuł ciekawy ale wkurzają mnie te przykłady! bo [wg mnie] scroll powinien być tez w dół a nie tylko na boki...
Takie cos mnie zaistaresowało.
nie sadze aby ktos powiedzial ze sie czepiasz wlasnie po to jest link w arcie aby sie wypowiedziec :-)
[b]DONE
To moze i ja dodam klilka bledow, ktory znalazlem podczas lektury tekstu:
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.
Sugeruję użyć narzędzi do sprawdzania pisowni. Jest prościej
Artykuł został zaktualizowany.
Poprawiono wszystkie znalezione literówki.
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?
<?php function _gc($session_lifetime) ?>
<?php $_SESSION ?>
<?php http://www.php.net/session_register(); ?>
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.
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ć.
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?
ALTER TABLE `sessions` ADD UNIQUE ( `session_id` )
<?php http://www.php.net/error_reporting(E_ALL); ?>
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.
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] ?
poprawione
_gc dziala po zmianie:
<?php function _gc($session_lifetime) { $session_lifetime = http://www.php.net/time() - $this->session_lifetime; $sql_query = (\"DELETE FROM \" . $this->session_table . \" WHERE session_time < \" . $session_lifetime . \";\"); $result = @http://www.php.net/mysql_query($sql_query); ?>
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ł
Pozdrawiam
Bartek
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:
<?php class SessionHandler { /** * Dane konfiguracyjne serwera bazy danych - do polączenia. * @var array $dbConfig - Ustawiane przez konstruktor @see __construct(); * @access private */ private http://www.php.net/static $dbConfig = http://www.php.net/array(); /** * Tabela z danymi sesyjnymi * @var string $sessionTable - Ustawiana przez konstruktor @see __construct(); * @access private */ private http://www.php.net/static $sessionTable; /** * Zmienna przechowujaca czas zycia sesji * @var int $sessionLifetime - Ustawiana przez konstruktor @see __construct(); * @access private */ private $sessionLifetime; /** * Zmienna przechowujaca instancje abstrakcji bazy, posluzy do komunikacji z baza. * @var Creole $dbConnection * @access private */ private http://www.php.net/static $dbConnection; /** * Konstruktor klasy SessionHandler * Przygotowanie polaczenia ze baza danych i okreslenie parametrow wstepnych * @param array $dbConfig - Dane konfiguracyjne bazy. * @param string $sessionTable - nazwa tabeli przechowującej dane sesji. * @param int $sessionLifetime - Maksymalny czas istnienia nieaktywnej sesji. * @return void * @access public */ public function __construct($dbConfig = false, $sessionTable = false, $sessionLifetime = 0) { if($dbConfig AND $sessionTable) { /* * Dane do polaczenia z baza danych. */ $this->dbConfig['type'] = $dbConfig['type']; $this->dbConfig['host'] = $dbConfig['host']; $this->dbConfig['username'] = $dbConfig['user']; $this->dbConfig['password'] = $dbConfig['password']; $this->dbConfig['database'] = $dbConfig['database']; /* * Pozostale dane konfiguracyjne - nazwa tabeli przechowujacej dane sesji * oraz czas okreslajcy zycie sesji. */ $this->sessionTable = $sessionTable; $this->sessionLifetime = $sessionLifetime; /* * Stala przechowujaca sciezke do abstrakcji DB */ http://www.php.net/define('DB_ABSTRACT_PATH', 'adodb/adodb.inc.php'); } else { // error_handler(); } } /** * Nawiązywanie połączenia bazodanowego * @return bool * @access private */ private function dbConnect() { if(require_once(DB_ABSTRACT_PATH)) { $this->dbConnection = &ADONewConnection($this->dbConfig['type']); $this->dbConnection->PConnect($this->dbConfig['host'], $this->dbConfig['username'], $this->dbConfig['password'], $this->dbConfig['database']); return true; } else { return false; } } /** * Inicjalizacja sesji * @param string $sesion_savepath Lokalizacja zapisu sesji * @param string $session_name Nazwa sesji * @return bool * @access private */ public function _open($session_savepath, $session_name) { if($this->dbConnect()) { return true; } } /** * Zakończenie sesji * @return bool * @access private */ public function _close() { if($this->_gc()) { return true; } else { return false; } } /** * Odczytywanie danych sesyjnych * @param string $sessionID - Identyfikator sesji * @return mixed * @access public */ public function _read($sessionID) { //$stmt = $this->dbConnection->Prepare('SELECT sessionValue FROM ? WHERE sessionID = ?'); //$rs = $this->dbConnection->Execute($stmt,array($this->sessionTable, $sessionID)); if($array = $this->dbConnection->GetAssoc(\"SELECT sessionValue FROM \".$this->sessionTable.\" WHERE sessionID = \".$sessionID)) { return($array['sessionValue']); } else { return false; } } /** * Zapisywanie danych sesji * @param string $sessionID Identyfikator sesji * @param string $sessionValue Wartości sesyjne * @return bool * @access public */ public function _write($sessionID, $sessionValue) { $stmt = $this->dbConnection->Prepare('INSERT INTO ? VALUES(?,?,?,?)'); if($this->dbConnection->Execute($stmt,http://www.php.net/array($this->sessionTable, $sessionID, http://www.php.net/time(), http://www.php.net/time(), $sessionValue))) { return true; } else { $stmt = $this->dbConnection->Prepare('UPDATE ? SET sessionTime = ?, sessionValue = ? WHERE sessionID = ?'); if($this->dbConnection->Execute($stmt,http://www.php.net/array($this->sessionTable, http://www.php.net/time(), $sessionValue, $sessionID))) { return true; } else { return false; } } } /** * Usuwanie danych sesji * @param string $sessionID - Identyfikator sesji * @return bool * @access public */ function _destroy($sessionID) { $stmt = $this->dbConnection->Prepare('DELETE FROM ? WHERE sessionID = ?'); if($this->dbConnection->Execute($stmt,http://www.php.net/array($this->sessionTable, $sessionID))) { return true; } else { return false; } } /** * \"Garbage collection\" - Usuwanie niepotrzebnych danych sesji * @return bool * @access public */ function _gc() { $sessionDeletetime = http://www.php.net/time() - $this->sessionLifetime; $stmt = $this->dbConnection->Prepare('DELETE FROM ? WHERE sessionTime < ?'); if($this->dbConnection->Execute($stmt,http://www.php.net/array($this->sessionTable, $sessionDeletetime))) { return true; } else { return false; } } } ?>
<?php include(\"SessionHandler.class.php\"); $dupa = 15; $db_config['type'] = 'mysql'; $db_config['host'] = 'host'; $db_config['user']= 'user'; $db_config['password'] = 'pass'; $db_config['datebase'] = 'db'; // Tworzenie obiektu zarządzania sesją $session = new SessionHandler($db_config, 'sessions', 300); // Zastępowanie domyślnych funkcji metodami sesji http://www.php.net/session_set_save_handler (http://www.php.net/array(&$session, '_open'), http://www.php.net/array(&$session, '_close'), http://www.php.net/array(&$session, '_read'), http://www.php.net/array(&$session, '_write'), http://www.php.net/array(&$session, '_destroy'), http://www.php.net/array(&$session, '_gc') ); http://www.php.net/session_start(); http://www.php.net/session_register('dupa'); if($_GET['action'] == 'check') { http://www.php.net/echo $_SESSION['dupa']; } ?> <a href='session.php?action=check'>test</a>
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 Czy to może wina serwera, że najpierw updatuje, a poźniej sprawdza dopiero czy powinien
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 ?
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)
<?php function connection() { // Typ połączenia $connect_type = $this->db_config['persistent'] ? 'mysql_pconnect' : 'mysql_connect'; $connect = $connect_type($this->db_config['host'], $this->db_config['user'], $this->db_config['password']) or http://www.php.net/die(\"Nieee\"); $this->p = $connect; $db_select = http://www.php.net/mysql_select_db ($this->db_config['datebase']); if ($connect && $db_select) { return true; } else { return false; } } ?>
<?php function _gc($session_lifetime) { $session_lifetime = http://www.php.net/time() - $this->session_lifetime; $sql_query = \"DELETE FROM \" . $this->session_table . \" WHERE session_time < \" . time() - $session_lifetime . \"\"; $result = @http://www.php.net/mysql_query($sql_query,$this->p); if ($result) { return true; } else { return false; } } ?>
<?php var $p; ?>
<?php $this->p = $connect; ?>
<?php http://www.php.net/mysql_query($sql_query,$this->p) ?>
witam
dziekuje Kwiatkowi za udostepnie tej klasy
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
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:
<?php http://www.php.net/session_set_save_handler (http://www.php.net/array(&$session, '_open'), http://www.php.net/array(&$session, '_close'), http://www.php.net/array(&$session, '_read'), http://www.php.net/array(&$session, '_write'), http://www.php.net/array(&$session, '_destroy'), http://www.php.net/array(&$session, '_gc')); ?>
<?php class Session { var $db_s; var $session_table; var $session_lifetime; function __construct($db, $session_table, $session_lifetime = 0) { $this->db_s = $db; $this->session_table = $session_table; $this->session_lifetime = $session_lifetime; } function _open($session_savepath, $session_name) { return true; } function _close() { $this->_gc($this->session_lifetime); return true; } function _read($session_id) { $this->_gc($this->session_lifetime); $sql_query = "SELECT session_value FROM " . $this->session_table . " WHERE session_id = '" . $session_id . "'"; $result = $this->db_s->query($sql_query); if ($result && $result->num_rows > 0) { $ww = $result->fetch_assoc(); $session_value = $ww['session_value']; return $session_value; } else { return false; } } function _write($session_id, $session_value) { $session_start = http://www.php.net/time(); $session_time = http://www.php.net/time(); $sql_query = "INSERT INTO " . $this->session_table . " (session_id, session_start, session_time, session_value) VALUES ('" . $session_id . "', " . $session_start . ", " . $session_time . ", '" . $session_value . "')"; $result = $this->db_s->query($sql_query); if ($result) { return true; } else { $sql_query = "UPDATE " . $this->session_table . " SET session_time = " . $session_time . ", session_value = '" . $session_value . "' WHERE session_id = '" . $session_id . "'"; $result = $this->db_s->query($sql_query); if ($result) { return true;} else { return false; } } } function _destroy($session_id) { $sql_query = "DELETE FROM " . $this->session_table . " WHERE session_id = '" . $session_id . "'"; $result = $this->db_s->query($sql_query); if ($result) { return true; } else { return false; } } function _gc($session_lifetime) { $session_lifetime = http://www.php.net/time() - $this->session_lifetime; $sql_query = "DELETE FROM " . $this->session_table . " WHERE session_time < " . $session_lifetime; $result = $this->db_s->query($sql_query); if ($result) { return true; } else { return false; } } } $session_table = "sessions"; $session_lifetime = 10; $session_go = new Session($db, $session_table, $session_lifetime); http://www.php.net/session_set_save_handler (http://www.php.net/array(&$session_go, '_open'), http://www.php.net/array(&$session_go, '_close'), http://www.php.net/array(&$session_go, '_read'), http://www.php.net/array(&$session_go, '_write'), http://www.php.net/array(&$session_go, '_destroy'), http://www.php.net/array(&$session_go, '_gc')); http://www.php.net/session_start(); ?>
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
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
<?php $sql = mySqlObject; ?>
<?php $ban = new banObject($sql); ?>
<?php $session = new sessionObject($sql, $lifetime = 300); //lub tak: class sessionObject extends mySqlObject ?>
Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)