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?
- 2054 megtekintés
Hozzászólások
memcached, adatbázis tábla
- A hozzászóláshoz be kell jelentkezni
Köszi, az lesz ha nem létezik erre az egyszerű problámára más megoldás. Kicsit bosszant, hogy egy változó miatt I/O műveletet kell végezni, még ha memcached akkor is.
- A hozzászóláshoz be kell jelentkezni
Nincs semmi mas perzisztens amit ket session egymastol fuggetlenul olvasni tudna.
--
()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.
- A hozzászóláshoz be kell jelentkezni
( 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.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
( 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.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
Szerintem ha van 1 másodperc erre, akkor még a memcached adatbázis sem kell, csak egy egyszerű sor egy táblában. Vagy lockfile valahol, ez utóbbi még talán gyorsabb is.
- A hozzászóláshoz be kell jelentkezni
Van rá 1 másodperc, nem sebesség kritikus helyen van, inkább csak egy elegáns és 100%-os megoldás érdekelne. Hogyan csinálják a "nagyok"?
- A hozzászóláshoz be kell jelentkezni
Valahogy igy, ahogy fent leirattatott. Ez nem kepessegbeli hianyossag, maga a php ilyen sajnos.
--
()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.
- A hozzászóláshoz be kell jelentkezni
Ha definicio szerint az alkalmazasod maximum 1 szerveren fut akkor shared memory szerintem.
- A hozzászóláshoz be kell jelentkezni
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.<<
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni