A PHP munkamenet kezelése lehetővé teszi adatok megőrzését az egymást követő oldal lekérdezések között. Ez képessé tesz még testreszabhatóbb oldalak készítésére.
Ha ismered a PHPLIB munkamenet kezelését, sok hasonlóságot fogsz felfedezni a PHP munkamenet kezelő függvényeit illetően.
Minden webhelyedre látogató egy-egy egyedi azonosítót kap, az úgynevezett munkamenet azonosítót (session azonosítót). Ez vagy egy sütiben (cookie) tárolódik a látogató gépén, vagy az URL-ben közlekedik oldalról oldalra.
A munkamenet támogatás lehetővé teszi tetszőleges számú változó megőrzését a PHP oldal lekérdezések között. Ha egy látogató érkezik webhelyedre, háromféleképpen kezdődhet el, vagy folytatódhat a munkamenete. Mindhárom esetben a PHP egy munkamenet azonosító érkezését várja. Ha nem érkezik, új munkamenetet indít.
Ha a session.auto_start be van kapcsolva, a PHP automatikusan megkezdni / folytatja a munkamenetet. Ha ez nincs bekapcsolva, akkor közvetlenül a session_start() függvénnyel, vagy közvetve a session_register() függvénnyel tudod a munkamenetet folytatni / megkezdeni. Ha egy érvényes azonosító érkezett, a korábban beállított munkamenet környezet visszaállításra kerül.
Minden a munkamenethez rendelt változó szerializálódik a PHP oldal futásának befejeződésekor. A nem definiált, de munkamenethez rendelt változók a későbbi folytatásokban nem jönnek újból létre.
A track_vars és register_globals ini beállítások befolyásolják a munkamenet változók tárolásának és visszaállításának módját.
Note: A PHP 4.0.3 verziótól kezdve a track_vars mindig be van kapcsolva, kikapcsolására nincs mód.
Note: A 4.1.0 verziótól kezdve a $_SESSION szuperglobális változó rendelkezésre áll, csakúgy mint a $_POST, $_GET, $_REQUEST és így tovább. A $HTTP_SESSION_VARS változótól eltérően a $_SESSION mindig elérhető (szuperglobális). Ezért a global kulcsszóval nem szabad egyűtt használni a $_SESSION változót.
Ha a track_vars be van kapcsolva, és a register_globals ki van kapcsolva, csak a $HTTP_SESSION_VARS asszociatív tömb elemei a munkamenet változók. A visszaállított munkamenet változók is csak a $HTTP_SESSION_VARS tömbben lesznek megtalálhatóak.
Example#1 Változó bejegyzése a munkamenetbe a track_vars bekapcsolt állapotában.
<?php
session_start();
if (isset($HTTP_SESSION_VARS['szamlalo'])) {
$HTTP_SESSION_VARS['szamlalo']++;
}
else {
$HTTP_SESSION_VARS['szamlalo'] = 0;
}
?>
A $_SESSION változó használata (vagy a $HTTP_SESSION_VARS változó használata PHP 4.0.6 vagy régebbi verzió esetén) javasolt biztonsági és olvashatósági szempontok miatt. A $_SESSION vagy $HTTP_SESSION_VARS használatával nincs szükség a session_register()/session_unregister()/session_is_registered() függvényekre. A programozók éppen úgy dolgozhatnak a munkamenet változókkal, mint a "normális" változókkal.
Example#2 Változó bejegyzése a munkamenetbe a $_SESSION tömbbel.
<?php
session_start();
// Használd a $HTTP_SESSION_VARS tömböt PHP 4.0.6 vagy régebbi verzióban
if (!isset($_SESSION['szamlalo'])) {
$_SESSION['szamlalo'] = 0;
} else {
$_SESSION['szamlalo']++;
}
?>
Example#3 Változó bejegyzés törlése a $_SESSION tömbbel.
<?php
session_start();
// Használd a $HTTP_SESSION_VARS tömböt PHP 4.0.6 vagy régebbi verzióban
unset($_SESSION['szamlalo']);
?>
Ha a register_globals be van kapcsolva, akkor minden globális változó lehet munkamenet változóként regisztrálva, és a munkamenet későbbi folytatásaiban is létre fognak jönni globális változókként a bejegyzett változók. Mivel ebben az esetben a PHP-nek tudnia kell, hogy mely globális változók bejegyzett munkamenet változók is egyben, a programozónak a session_register() függvényt kell használnia. Emlékeztetőként a $HTTP_SESSION_VARS/$_SESSION tömbök használatakor nincs szükség a session_register() függvényre.
Ha a $HTTP_SESSION_VARS/$_SESSION tömböt használod és kikapcsolod a register_globals beállítást, ne használd a session_register(), session_is_registered() és session_unregister() függvényeket.
Ha bekapcsolod a register_globals beállítást, a session_unregister() függvényt kell használnod, mivel a munkamenet változók globális változókban jelennek meg. A register_globals kikapcsolása javasolt mind biztonsági, mind teljesítmény szempontokból.
Example#4 Változó bejegyzése a register_globals bekapcsolt állapota mellett.
<?php
if (!session_is_registered('szamlalo')) {
session_register("szamlalo");
$szamlalo = 0;
}
else {
$szamlalo++;
}
?>
Ha mind a track_vars, mind a register_globals beállítások be vannak kapcsolva, a globális változók és a $HTTP_SESSION_VARS/$_SESSION tömbök elemei ugynazokra az értékekre fognak mutatni a már bejegyzett változókat illetően.
Ha a programozó a session_register() függvényt használja munkamenet változók bejegyzésére, akkor ebben az esetben a $HTTP_SESSION_VARS/$_SESSION tömbökben nem fog megjelenni ez a változó a következő munkamenet folytatása előtt (azaz a következő PHP program futás előtt).
Kétféleképpen "közlekedhet" a munkamenet azonosító:
A munkamenetkezelő modul mindkét formát támogatja. A sütik optimálisak, de sajnos nem megbízhatóak (sokan nem fogadják a sütiket), ezért nem lehet rájuk biztonsággal építeni. A második módszer az azonosítót közvetlenül az URL-ekbe és űrlapokba helyezi.
A PHP képes ezutóbbi azonosító terjesztést átlátszóan végezni, ha az --enable-trans-sid opcióval fodítottad. Ha ezt az opciót bekapcsolod, a reltív URL-ekhez és űrlapokhoz automatikusan hozzáteszi a PHP a munkamenet azonosítót. Alternatív módszerként használhatod a SID konstanst, ami definiált, ha a kliens nem küldte vissza a megfelelő sütit. A SID vagy session_name=session_id (munkamenet név, munkamenet azonosító) formátumú, vagy egy üres karektersorozat.
A következő példa egy változó bejegyzést, és egy következő oldalra mutató link készítését mutatja,
Example#5 Egy látogató által lehívott oldalak számlálása
<?php
if (!session_is_registered('szamlalo')) {
session_register('szamlalo');
$szamlalo = 1;
}
else {
$szamlalo++;
}
?>
Üdv látogató, eddig <?php echo $szamlalo; ?> alkalommal
láttad ezt az oldalt.<p>
<?php
# Az <?php echo SID?> szükséges, hogy a munkamenet azonosítót
# megőrizzük abban az esetben is, ha a látogató nem fogadja
# a sütit. (<?=SID?> használható, ha a rövid tagek engedélyezettek)
?>
A továbblépéshez <A HREF="kovoldal.php?<?php echo SID?>">kattints ide</A>.
A <?=SID?> nem szükséges, ha az --enable-trans-sid opcióval fordítottad a PHP-t.
Note: A nem relatív hivatkozások feltételezetten külső oldalakra mutatnak, ezért nem egészülnek ki automatikusan a SID-el. Komoly biztonsági problémákat okozna, ha a SID-ek elkerülnének egy másik kiszolgálóhoz.
A munkamenethez tartozó adatok állományokban tárolódnak. Ha adatbázisban, vagy más tároló eszközön szeretnéd rögzíteni a munkamenethez tartozó adatokat, a session_set_save_handler() függvényt kell használnod a saját tároló függvényeid bejegyzéséhez.
A munkamenet kezelő függvények számos beállítási lehetőséget biztosítanak, amiket a php.ini állományban helyezhetsz el. Egy rövid áttekintés következik.
Ha ezt az értéket egy mindenki által olvasható könyvtárra állítod (mint az alapbeállítású /tmp), akkor a kiszolgálón lévő többi felhasználó el tudja kapni a munkameneteidet a könyvtárban lévő állományok neve és tartalma alapján.
Note: A munkamenetek támogatása a PHP 4.0 verzióban jelent meg.