Portrety Uliczne Nieznajomych - zobacz wyjątkową galerię portretów z warszawskich ulic
ZALOGUJ SIĘ
login:
hasło:
przypomnij hasło
załóż konto użytkownika
(i zobacz kilka porad gratis)
   
WYSZUKIWARKA I DZIAŁY
całe porady  tytuły
zaznacz działy do przeszukania
(brak wyboru = wszystkie działy)
PHP
MySQL >
PostgreSQL
SQLite
Perl
Java
XML
XSLT
XPath
WML
SVG
RegExp
Wyszukiwarki
Ochrona
VBScript
Google Plus
XHTML/CSS
JavaScript
Grafika
Flash
Photoshop
Windows
Linux
Bash
Apache
Procmail
E-biznes
Explorer
Opera
Firefox
Inne porady
   
KURSY, DOKUMENTACJE
Własne:
XHTML/CSS
JavaScript
ActionScript
WML, RSS, SSI
Pozostałe:
PHP
MySQL
Java API
więcej...
   
użytkowników online: 15
W CZYM MOGĘ POMÓC?


   
OPINIE UŻYTKOWNIKÓW
Prawdziwa skarbnica wiedzy na temat tworzenia stron WWW i nie tylko. Korzystam z porad praktycznie codziennie, jest mi to niezbędne w mojej pracy. Sam zajmuję się tworzeniem serwisów, ale porady pisane przez Darka sa dla mnie nieocenioną pomocą! Proste, czytelne i zrozumiałe dla każdego! Czekam na więcej!

Krzysztof Szypulski
KESS - projektowanie stron

   
GALERIA FOTOGRAFII
   
PODRĘCZNIK PHP 5.x, 4.x, 3.x - częściowo spolszczony / źródło: www.php.net

[Spis] [A] [B] [C] [D] [E] [F] [G] [H] [I] [J] [K] [L] [M] [N] [O] [P] [Q] [R] [S] [T] [U] [V] [X] [W] [Z]

CXI. Sesje

Obsługa sesji w PHP ma na celu zapewnienie sposobu na zachowanie pewnych danych w trakcie następujących po sobie wywołań strony. Pozwala to na budowanie bardziej spersonalizowanych aplikacji i zwiększenie atrakcyjności twojej strony internetowej.

Jeśli jesteś zaznajomiony z zarządzaniem sesją w PHPLIB, zauważysz że pewnie koncepcje są podobne w obsłudze sesji PHP.

Gość wchodzący na twoją stronę WWW otrzymuje unikalny identyfikator, tzw. id sesji. Jest ono przechowywane albo jako ciasteczko po stronie użytkownika lub propagowane w URL'u.

Obsługa sesji pozwala ci na rejestrowanie dowolnej ilości zmiennych, które mają być przekazywane pomiędzy stronami. Kiedy gość wchodzi na twoją strone, PHP automatycznie sprawdzi (jeśli session.auto_start jest ustawione na 1) lub na twoje życzenie (jawnie przez wywołanie session_start() lub niejawnie przez wywołanie session_register()) czy specyficzne id sesji zostało przypisane. Jeśli tak, poprzednio zachowane środowisko jest odtwarzane.

Wszystkie zarejestrowane zmienne są serializowane po wykonaniu całego kodu strony. Zarejestrowane zmienne, które są niezdefiniowane, są zaznaczane jako niezdefiniowane. Nie są one definiowane przez moduł sesji w następujących po sobie wywołaniach, chyba że użytkownik zdefiniuje je później.

Opcje konfiguracyjne track_vars i register_globals wpływają na to, jak zmienne sesyjne są przechowywane i odtwarzane.

Notatka: Od PHP w wersji 4.0.3 opcja track_vars jest zawsze włączona.

Notatka: Od wersji PHP 4.1.0 dostępna jest globalna zmienna $_SESSION, podobnie jak $_POST, $_GET, $_REQUEST i tak dalej. W odróżnieniu od $HTTP_SESSION_VARS, $_SESSION jest zawsze globalna. W związku z tym global nie powinno być użyte do $_SESSION.

Jeśli włączona jest opcja track_vars a register_globals jest wyłączona, tylko pozycje należące do zmiennej asocjacyjnej $HTTP_SESSION_VARS mogą być zarejestrowane jako zmienne sesyjne. Odtworzone zmienne sesyjne będą dostępne tylko w zmiennej $HTTP_SESSION_VARS.

Przykład 1. Rejestracja zmiennej z włączoną opcją track_vars

<?php
session_start
();
if (isset(
$HTTP_SESSION_VARS['count'])) {
  
$HTTP_SESSION_VARS['count']++;
}
else {
  
$HTTP_SESSION_VARS['count'] = 0;
}
?>

Użycie $_SESSION (lub $HTTP_SESSION_VARS dla wersji PHP 4.0.6 i starszych) jest wskazane ze względów bezpieczeństwa i czytelności kodu. Używając $_SESSION lub $HTTP_SESSION_VARS nie ma potrzeby używać funkcji session_register()/session_unregister()/session_is_registered(). Użytkownicy mogą uzyskiwać dostęp do zmiennych sesyjnych tak jak do normalnych zmiennych.

Przykład 2. Rejestrowanie zmiennych przez $_SESSION

<?php
session_start
();
// Użyj $HTTP_SESSION_VARS dla PHP 4.0.6 i starszych
if (!isset($_SESSION['count'])) {
  
$_SESSION['count'] = 0;
} else {
  
$_SESSION['count']++;
}
?>

Przykład 3. Wyrejestrowywanie zmiennej korzystając z $_SESSION

<?php
session_start
()
// Użyj $HTTP_SESSION_VARS dla PHP 4.0.6 i starszych
unset($_SESSION['count']);
?>

Jeśli włączona jest opcja register_globals, wszystkie globalne zmienne mogą być zarejestrowane jako zmienne sesyjne a zmienne sesyjne będą odtworzone do odpowiadających im zmiennych globalnych. Ponieważ PHP musi wiedzieć które globalne zmienne są zarejestrowane jako zmienne sesyjne, użytkownik musi użyć funkcji session_register() podczas gdy $HTTP_SESSION_VARS/$_SESSION nie muszą używać session_register().

Uwaga!

Jeśli używane są tablice $HTTP_SESSION_VARS/$_SESSION i i wyłączona jest opcja register_globals, nie powinno się używać session_register(), session_is_registered() i session_unregister().

Jeśli włączona zostanie opcja register_globals, powinno się używać session_unregister() ponieważ zmienne sesyjne są rejestrowane jako zmienne globalne kiedy dane sesyjne są deserializowane. Wyłączenie register_globals jest zalecane ze względów bezpieczeństwa i wydajności.

Przykład 4. Rejestracja zmiennych z włączoną opcją register_globals

<?php
if (!session_is_registered('count')) {
  
session_register('count');
  
$count = 0;
}
else {
  
$count++;
}
?>

Jeśli włączone są obie opcje, track_vars i register_globals, globalne zmienne i wpisy w $HTTP_SESSION_VARS/$_SESSION będą referencjami do tej samej, już zarejestrowanej zmiennej.

Jeśli użytkownik użyje session_register() do zarejestrowania zmiennej sesyjnej, $HTTP_SESSION_VARS/$_SESSION nie będą zawierały tych zmiennych w tablicy dopóki nie zostanie ona odczytana z miejsca przechowywania sesji (np. do czasu następnego wywołania).

Istnieją dwie metody propagacji identyfikatora sesji:

  • Ciasteczka

  • Parametry URL'a

Moduł sesji obsługuje obie metody. Ciasteczka są metodą optymalną, ale ponieważ nie są one pewne (klienci nie muszą ich akceptować), nie możemy na nich polegać. Druga metora wstawia identyfikatory sesji bezpośrednio do URL'i.

PHP może to robić 'przezroczyście' jeśli został skompilowany z opcją --enable-trans-sid. Jeśli włączysz tą opcję, względne URI zostaną automatycznie podmienione tak, aby zawierały identyfikator sesji. Możesz także użyć stałej SID która jest definiowana jeśli klient nie wysłał odpowiedniego ciastka. SID jest albo w postaci nazwa_sesji=id_sesji lub pustym stringiem.

Notatka: Dyrektywa arg_separator.output którą można umieścić w pliku konfiguracyjnym php.ini pozwala ustawić własny separator argumentów.

Poniższy przykład demonstruje jak zarejestrować zmienną i jak prawidłowo wstawić link do kolejnej strony korzystając ze stałej SID.

Przykład 5. Zliczanie ilości odwiedzin pojedyńczego użytkownika

<?php
if (!session_is_registered('count')) {
  
session_register('count');
  
$count = 1;
}
else {
  
$count++;
}
?>

Witaj gościu. Oglądasz tą stronę <?php echo $count; ?> raz.<p>

<?php
# <?php echo SID?> (<?=SID?> może być użyte jeśli włączona jest możliwość
# używania krótkich tagów) jest konieczne do zachowania identyfikatora
# sesji jeśli użytkownik wyłączył ciastka
?>

Aby kontynuować, <A HREF="nextpage.php?<?php echo SID?>">kliknij tutaj</A>

<?=SID?> nie jest konieczne jeśli przy kompilacji PHP użyta została opcja --enable-trans-sid.

Notatka: PHP zakłada, że bezwzględne URLe odnoszą się do zewnętrznych serwisów, więc nie trzeba przekazywać SID, ponieważ istniałoby niebezpieczeństwo podkradania SIDów przez inny serwer.

Aby zaimplementować przechowywanie danych sesyjnych w bazie danych lub w dowolnej innej postaci, musisz użyć session_set_save_handler() do stworzenia zestawu funkcji przechowujących dane.

System zarządzania sesją obsługuje wiele opcji konfiguracyjnych, które możesz wstawić do swojego pliku php.ini. Oto ich krótki przegląd.

  • session.save_handler definiuje nazwę procedury obsługi, która jest używana do przechowywania i odczytu danych skojarzonych z sesją. Domyślnie files.

  • session.save_path definiuje argument, który jest przekazywany procedurze obsługi zapisu danych. Jeśli wybierzesz domyślną procedurę obsługi, jest to ścieżka gdzie tworzone będą pliki z danymi. Domyślnie /tmp. Jeśli głębokość ścieżki określonej w parametrze session.save_path jest większa niż 2, nie przeprowadzone zostanie zbieranie śmieci.

    Ostrzeżenie

    Jeśli w tej opcji ustawisz katalog, który jest ogólnie dostępny, jak na przykład /tmp (domyślna wartość), inni użytkownicy serwera będą w stanie przechwycić sesję przez pobranie listy plików z tego katalogu.

  • session.name określa nazwę sesji, która jest używana jako nazwa ciastka. Powinna zawierać tylko znaki alfanumeryczne. Domyślnie PHPSESSID.

  • session.auto_start określa, czy moduł sesji rozpoczyna sesję na początku wywołania. Domyślnie 0 (wyłączony).

  • session.cookie_lifetime określa długość życia w sekundach ciastka przesyłanego do przeglądarki. Wartość 0 oznacza "dopóki przeglądarka nie została zamknięta". Domyślnie 0.

  • session.serialize_handler określa nazwę procedury obsługi, która zostanie użyta do serializacji/odserializacji danych. Obecnie obsługiwany jest wewnętrzny format PHP (nazwa php i WDDX (nazwa wddx). WDDX jest jedynym dostępnym formatem jeśli PHP zostało skompilowane z obsługą WDDX. Domyślnie php.

  • session.gc_probability określa prawdopodobieństwo w procentach rozpoczęcia procedury gc (garbage collection - zbieranie śmieci) przy każdym wywołaniu. Domyślnie 1.

  • session.gc_maxlifetime określa ilość sekund, po jakich dane będą rozpoznawane jako 'śmieci' i usuwane.

  • session.referer_check zawiera podciąg, z którym HTTP_REFERER ma być sprawdzany. Jeśli HTTP_REFERER został wysłany przez klienta i nie zawierał podanego podciągu, identyfikator sesji podany przez takiego klienta zostanie uznany za nieważny. Domyślnie jest to ciąg pusty.

  • session.entropy_file podaje ścieżkę do zewnętrznego zasobu (pliku), który będzie użyty jako dodatkowe źródło entropii w procesie tworzenia identyfikatora sesji. Przykłady to /dev/random lub /dev/urandom, które są dostępne na wielu systemach Unix.

  • session.entropy_length określa liczbę bajtów, która będzie odczytana z pliku podanego powyżej. Domyślnie 0 (wyłączona).

  • session.use_cookies określa czy moduł będzie używał ciasteczek do przechowywania identyfikatora sesji po stronie klienta. Domyślnie 1 (włączona).

  • session.use_only_cookies określa czy moduł będzie używał tylko ciasteczek do przechowywania identyfikatora sesji po stronie klienta. Domyślna wartość to 0 (dla wstecznej kompatybilności). Włączenie tej opcji zapobiega atakom opartym o przekazywanie identyfikatora sesji przez URL. Ta opcja została dodana w PHP 4.3.0.

  • session.cookie_path określa ścieżkę która będzie podana w session_cookie. Domyślnie /.

  • session.cookie_domain określa domenę która ma być podana w session_cookie. Domyślnie - pusta.

  • session.cache_limiter określa metodę używaną do przechowywania stron sesyjnych w pamięci podręcznej (nocache/private/private_no_expire/public). Domyślnie nocache.

  • session.cache_expire określa czas życia w minutach stron sesyjnych zachowanych w pamięci podręcznej. Nie ma to efektu dla metody nocache. Domyślnie 180

  • session.use_trans_sid określa czy będzie używana obsługa przezroczystego przekazywania identyfikatora sesji. Opcja brana pod uwagę tylko jeśli PHP zostało skompilowane z opcją --enable-trans-sid. Domyślnie 1 (włączona).

  • url_rewriter.tags określa które tagi HTML zostają przepisane w celu dopisania identyfikatora sesji jeśli włączona została opcja przezroczystego przekazywania identyfikatora sesji. Domyślnie a=href,area=href,frame=src,input=src,form=fakeentry

Notatka: Obsługa sesji została dodana w PHP 4.0.

Spis treści
session_cache_expire -- Zwróć bieżący czas przedawnienia pamięci podręcznej
session_cache_limiter --  Pobierz i/lub ustaw bieżący ogranicznik pamięci podręcznej
session_commit -- Alias of session_write_close()
session_decode -- Dekoduje dane sesji ze stringu
session_destroy -- Niszczy wszystkie dane zarejestrowane w sesji
session_encode --  Koduje dane bieżącej sesji do postaci ciągu tekstowego
session_get_cookie_params --  Pobierz parametry ciasteczka sesyjnego
session_id -- Pobierz i/lub ustaw identyfikator bieżącej sesji
session_is_registered --  Sprawdź czy globalna zmienna jest zarejestrowana w sesji
session_module_name -- Pobierz i/lub ustaw moduł bieżącej sesji
session_name -- Pobierz i/lub ustaw nazwę bieżącej sesji
session_regenerate_id --  Update the current session id with a newly generated one
session_register --  Zarejestruj jedną lub więcej zmiennych globalnych w bieżącej sesji
session_save_path -- Pobierz i/lub ustaw ścieżkę zapisu bieżącej sesji
session_set_cookie_params --  Ustaw parametry ciasteczka sesyjnego
session_set_save_handler --  Ustawia funkcje użytkownika do przechowywania sesji
session_start -- Inicjalizuj dane sesji
session_unregister --  Wyrejestruj zmienną globalną z bieżącej sesji
session_unset --  Zwolnij wszystkie zmienne sesyjne
session_write_close -- Zapisz dane i zakończ sesję



User Contributed Notes

02-Feb-2006 05:57

After spending 3 days trying to troubleshoot a session script that worked on a development server and not on production equipment, I discovered another 'feature' of IE6+.  If your URL includes an under_score in the name (e.g. server1.company_intranet.local), IE6 will refuse to keep a session alive.

After identifying the problem and trying all of the recommended php header fixes, the only real options were to use the IP instead or otherwise eliminate the _underscore_.

Hope this saves someone the 3 days it cost me.


just_somedood at yahoo dot com
01-Feb-2006 06:31

If you're running FreeBSD, and installed php5 (have not checked 4) from the ports, and are getting errors saying the session functions are undefined, try running phpinfo().  You'll probably see that the '--disable-all' configure command was used.  To fix, edit the /usr/ports/lang/php5/Makefile, and remove the '--disable-all' line.  In that directory, run a 'make deinstall', if you installed already.  Next, run 'make install' while still in that same directory.  It should work fine after that.


warkangaroo
26-Jan-2006 05:33

After hitting my head on the desk a few times trying to debug this construct,

$_SESSION['result']['number'] = $blah;

returning the warning,

"Warning: Cannot use a scalar value as an array"

and not saving my value, I found out that apparently $_SESSION['result'] is a reserved variable... I changed it to $_SESSION['bresult'] and it works fine.

Just trying to save someone a headache...


james dot ellis at gmail dot com
26-Jan-2006 09:23

If you are wondering why your garbage cleanup method is not being called, read on.

The manual notes for garbage cleanup state that the session.gc_divisor defaults to 100:

[code]
//http://php.net/manual/en/ref.session.php
session.gc_probability  ... Defaults to 1.
session.gc_divisor  .... session.gc_divisor defaults to 100.
[/code]

This would provide a gc probability of 1 in 100 ie. your garbage cleanup is going to be called 1% of the time.

Conversely, my PHP 5.1.1 install, compiled from source, contains this in the php.ini-recommended file (and my php.ini file):
[code]
; Define the probability that the 'garbage collection' process is started
; on every session initialization.
; The probability is calculated by using gc_probability/gc_divisor,
; e.g. 1/100 means there is a 1% chance that the GC process starts
; on each request.

session.gc_probability = 1
session.gc_divisor    = 1000
[/code]

A 0.1% probability by default. Based on the information provided, I set my gc_probability to 100,  thus providing a 1% probability stale sessions would be culled.

Moral:your local php.ini may differ from what the manual provides.


jerry dot walsh at gmail dot com
24-Jan-2006 03:56

If you're using sharedance to distributed php sessions across a group of machines beware of the following:

On a freebsd 6.x system I have observed a huge performance hit caused by dns/host file lookups.

To ensure maximum performance using sharedance you should set the 'SESSION_HANDLER_HOST' constant to an IP rather than a hostname.

When i did this my requests per second jumped from 55 to 389 requests per second!


ryanlwalker at gmail dot com
24-Jan-2006 06:47

In the simple example below, adding any text or whitespace at the beginning of the .php file before < ?php and calling session_start(); generates 2 warnings in IE.  Making < ?php the first line in the file solves the problem.

<?php
session_start
();
$_SESSION['cnt']= 1 + $_SESSION['cnt'];
echo
$_SESSION['cnt'];
?>

Hope somebody benefits from by hour(s) of frustration.


darkelf79 at gmail dot com
21-Jan-2006 12:00

If you set the session_id through the calling URL, it *will not* set the session cookie in 4.4.2.

For example:

www.example.com/?PHPSESSID=foo

This will set the session id to 'foo' but it won't actually set the session cookie. The last known version I'm aware of is 4.3.3 where it will set the cookie.

This doesn't appear to be definitively mentioned in here anywhere. But according to the devs, it's not a bug. Hopefully this knowledge will help you out if you're experiencing the same problem.


pascal.fr => gmail.com
20-Jan-2006 11:24

If you have saved an object in session, you must define the class of the object before the session_start().
If you don't do that, php will not know the class of the object, and his type will be "__PHP_Incomplete_Class".

This:
<?php
session_start
();

class
Foo{
   var
$fooVar = 'Hello world !!!';
}

$myFoo = new Foo();
$_SESSION['myFoo'] = $myFoo;
echo
'Save in session';
?>
define the Foo class and save an instance  in session.

<?php
session_start
();

echo
'<pre>';
  
print_r( $_SESSION ); // don't know the Foo class...
echo '</pre>';
?>

will print :

Array
(
   [myFoo] => __PHP_Incomplete_Class Object
       (
           [__PHP_Incomplete_Class_Name] => foo
           [fooVar] => Hello world !!!
       )

)


royappa at spiralfx dot com
16-Jan-2006 10:19

This is just to note that I was able to fix my problems due to the many helpful comments here.

The problem I was having was as follows:
a) I was dynamically generating a file to download
b) When the user clicked "Save" in MSIE, and then imported the download file into the application, all was well.
c) When the user clicked "Open" to directly import the file, the application would throw an error.

I believe what was happening is that the browser was not saving a local copy of the file due to the "no-store" directive, when the user clicks "Open" directly.

Therefore the examples above regarding pragma & cache-control were useful to resolving it.

Thanks for all the help. I just want to add also that the following web page was of great help to see the actual HTTP headers being sent by the web app: http://www.rexswain.com/httpview.html

Much easier than doing telnet to port 80! Hope this helps other also.   

Andrew Royappa


Ravi Chotalia
27-Dec-2005 04:12

In answer to..
-PHP SESSIONS NOT WORKING in with windows---
...solution on the session cookie path.
I am running Apache 2 and PHP 4.4.0 on a Windows XP SP2.
...
----------------------------------

It was a small mistake in my directory stucture,

I have changed from c:\temp to c:\Temp as I had directory called "temp" not "Temp".Now session is working properly in my case.

Make sure directory name is same, in windows environment too.


marou at marou dot com
22-Dec-2005 05:49

In reponse to fondman at hotmail dot com with the 4.4.0 issue with local variables replacing session variables.

It also happens in 4.4.3. 

I have a development environment set up with 5.0, and the production environment is 4.4.3.  I had set some local variables with the same name as one of my session variables.  It did the same thing you described on the production box, yet worked fine in development.

Just an FYI.


jazfresh at hotmail dot com
20-Dec-2005 03:55

The vanilla implementation of session will blindly spew back the value of the session_id that the user sends it after URL decoding it. This can be used as an attack vector, by including strings like "%0D%0ALocation:%20http://someothersite.com/%0D%0A" in the cookie. Never trust user input, always cleanse it. If you only expect alphanumerics in the session hash, reject any session_id that doesn't contain it.

<?php
if(!preg_match('#^[[:alnum:]]+$#', $_COOKIE['session_id'])) {
  unset(
$_COOKIE['session_id']);
}
session_start();
?>


Florian Sievers
11-Dec-2005 08:51

In addition Firefox doesn't only handel the session over differnet tabs it also do this if you open a new window. So you can work with the same session in different windows and different tabs.


djohnson at jsatech dot com
09-Dec-2005 05:00

Be warned, when working with tab-based browsers like Opera and Firefox, sessions are preserved across tabs.  These can be  either a good thing or bad thing, depending upon your application.  We found this to be problem, if we wanted to log in as two different users in two different tabs.  This is not possible: either the second tab will have the information from the first, or logging into the second will replace the information in the first tab. 

If you close a tab, the session is still persistent. Only when you close the window will the session information be deleted from the browser cache.  IE deals with sessions just fine.  There is probably some way to adjust the settings in Firefox or Opera, but that is not the default, and will affect most users.


bgshea at gmail dot com
04-Dec-2005 10:18

to johnlonely at gmail dot com

the sesion.cookie_path should be used for cookie security. The cookie_path is the path on the server for which the cookies are valid.

i.e. www.example.dom/mywepage/

if cookie_path="/mywebpage"

then

www.example.dom/someonespage/

will not have access to them. I use this parameter without problems.

I'm not saying that this will make cookies secure, but certainly others of www.example.dom will not have access to them.

However, if you have other directories say www.example.dom/niftystuff that you want the cookie to be valid for, then cookie_path needs to be "/".

This is better for servers that use the /~user/ user aliasing.


jodybrabec at yahoo dot com
30-Nov-2005 12:50

To stop PHPSESSID from appearing in the url, try inserting these two lines just before session_start() --
ini_set("url_rewriter.tags","");
ini_set(

 

 
  © 1996-2012 & Reporter.plmiejscao serwisieabonamentwarunki korzystaniaRSSkontakt