PHP 5.2.6 session-ök között változó érték átadás

Adott egy egyszerű adatbázis kezelő, a userek belépés után session-ökben futnak. Létre kellene hozni, egy olyan változót, amit minden session-ből el lehet érni. $GLOBALS["akarmi"]-re gondoltam, de az már session-ön belül is elveszik, ha egy másik php file fut. Ha a Register Globals"-t On-ra állítom, akkor minden ok, de ezt szeretném elkerülni. Javaslat?

Hozzászólások

( nehai | 2010. február 15., hétfő - 12:36 )
nem létezik erre az egyszerű problámára más megoldás
@

A problema nem annyira egyszeru. Ugyanis feltehetoen kezelned kell a konkurenciat is. Azaz egy keres lefutasa alatt (php miatt feltetelezem webes rendszerrol van szo) is megvaltozhat ennek a valtozonak az erteke, ami problemat okozhat.

Ezaz, hogyan szokták az ilyen problémákat megoldani? A feladat csak annyi, hogyha valaki az egyik session-ben rányom egy submit gombra, addig a többi session várjon addig amíg az egyik session ujra engedélyt nem ad. A probléma abból adódhat ha kérés lefolyása alatt a többi session-ben is megnyomják a gombot. Azért gondoltam a változó beállításra mert lényegesen rövidebb idő, mint egy adatbázis kérés. Kisebb az esély a duplikálódásra. Valami elegáns megoldást kellene találni erre a problémára.

( nehai | 2010. február 15., hétfő - 21:34 )
Ezaz, hogyan szokták az ilyen problémákat megoldani?
@

kulcsszavak: optimisctic concurrency, pessimistic concurrency

Persze a magam reszerol meg nem pontosan ertem, hogy mi a feladat. Feltetelezem, hogy egy elozoleg lekert adat modositasarol van szo. pl lock-fajl esetleg megoldas lehet. Amig az egyik szal megnyitotta irasra addig, a tobbi nem tudja megnyitni, csak ha az mar bezarta. Esetleg ezt lehetne kihasznalni valahogy.

Közben egy megoldás eszembe jututt, bár nem túl elegáns. Hagyom hogy a sessonok jelezzék a szándékukat, de a submit után várok 1 másodpercet (ennyi idő alatt biztosan lefut egy kérés), és megnézem hogy más session nem kezdeményezett e. Ha igen akoor dobom a submit-ot. Az lesz a nyerő akinek lesz tiszta 1 másodperce.

Ha definicio szerint az alkalmazasod maximum 1 szerveren fut akkor shared memory szerintem.

Ha mar a global-ban gondolkodtal...

<?php ob_start();

session_name('GLOB');
session_id('TEST');
session_start();
$a = $_SESSION['key'];
session_write_close();

echo "a = ". ++$a;

session_name('GLOB');
session_id('TEST');
session_start();
$_SESSION['key']=$a;
session_write_close();
?>
>>Tell your parents not to ruin the world that you will live in.<<

Köszi a hozzászólásokat és az infókat. Picit utána olvastam a dolgoknak, tényleg nem annyira egyszerű problémát vetettem fel mint amilyennek első látásra tűnt. Ha sebességkritikus helyen kellene alkalmaznom ilyet valószínűleg egy darabig vakarnám a fejem búbját.

Valószínűleg a shared memory megoldás mellet döntök(hacsak valamelyik biztonsági szakember gyorsan le nem beszé róla), a concurrency kezelését pedig optimistic módon oldom meg, hiszen a változó tárolása a memóriában sokkal gyorsabb mint I/O műveletnél, nagyon kicsi lesz az esély az ütközésre.