SESSION eltünedezik.
Sziasztok!
Elég sokat használok AJAX technológiát, és rendszeresen visszatér egy probléma.
PHP val mentek sessinba adatokat, és néha, a doom betöltődése utáni közvetlen ajax lekérést kezelő PHP nem látja a sessiont.
Példa:
printelem ezt:Ez mondjuk a JS:server.php:Ez persze csak egy példa. Az elv a lényeges.
Hogy néha, ilyenkor a server.php "elveszti" a sessiont.
Persze nem mindig.
Elképzelni sem tudom, hogy mi lehet a probléma hátterében.
A rendszer amit használok elég sokszor dolgozik ajax megoldással. (prototype)
Valakitől hallottam, hogy csak x db ajax lekérés futhat egy időben. Lehet esetleg ez a probléma, de akkor miért KEZELŐDIK a lekérés, és miért csak a
session tűnik el?
Miért "instabilitás" a jellemző a dologra, ahelyett, hogy egyszerűen nem működne?
Már párszor találkoztam ezzel a problémával, de sajnos még senki nem tudott választ adni a miértre.
Tudom, hogy ez a kérdés nem csak php témába tartozik, azért raktam ide, mert a fő tünet php-re vonatkozik.
■ Elég sokat használok AJAX technológiát, és rendszeresen visszatér egy probléma.
PHP val mentek sessinba adatokat, és néha, a doom betöltődése utáni közvetlen ajax lekérést kezelő PHP nem látja a sessiont.
Példa:
printelem ezt:
$_SESSION['labda'] = 52;
print "
<script>
ajaxlekeres();
</script>
"
function ajaxlekeres() {
var BaseURL = 'server.php';
var myPars = 'com='+comok+'&rnd='+this.RND;
var myAjax = new Ajax.Request( BaseURL, {
parameters: myPars,
onComplete: FrissitesUpdate
});
}
function FrissitesUpdate(originalRequest) {
$('target').innerHTML = originalRequest.responseText;
}
print $_SESSION['labda';
Hogy néha, ilyenkor a server.php "elveszti" a sessiont.
Persze nem mindig.
Elképzelni sem tudom, hogy mi lehet a probléma hátterében.
A rendszer amit használok elég sokszor dolgozik ajax megoldással. (prototype)
Valakitől hallottam, hogy csak x db ajax lekérés futhat egy időben. Lehet esetleg ez a probléma, de akkor miért KEZELŐDIK a lekérés, és miért csak a
session tűnik el?
Miért "instabilitás" a jellemző a dologra, ahelyett, hogy egyszerűen nem működne?
Már párszor találkoztam ezzel a problémával, de sajnos még senki nem tudott választ adni a miértre.
Tudom, hogy ez a kérdés nem csak php témába tartozik, azért raktam ide, mert a fő tünet php-re vonatkozik.
a doom betöltődése utáni
Milyen doom betöltődése után? Valami 90-es évekbeli játékot indítasz? Hogyan van beállítva a PHP session kezelése?
DOMReady event
A HTML feldolgozasa soran, ha a bongeszo megkapta a </script> tag-et, es eljutott a <script> tag-ig, elkezdi a JS ertelmezeset. A te peldakodod tehat egybol elkuldi az AJAX kerest a szervernek, meg mielott az oldalt eloallito PHP scripted veget ert volna. A session adatok lemezre irasat a PHP nem a $_SESSION szuperglobal-ba iraskor vegzi, hanem a script futasanak a vegen.
Ha meg nem volt kiirva a session, akkor nem lesznek benne az adatok (es valoszinuleg meg jol felul is fogja irni a session-odet az ujonnan letrejott session). Az, hogy neha mukodik, neha nem azert van, mert neha elobb vegeter a script futasa, mint hogy beerkezne az AJAX-os keresed, neha meg nem (pl kliens gep, vagy halozat leterheltsegetol fuggoen).
Tehat kesleltetned kene az ajax keresek kikuldeset a DOMReady vagy DOMLoad esemenyig. Lasd <body> tag onload parametere vagy (inkabb ez a javasolt) az ajax lib-ed esemenykezeloje.
Igen, ez megmagyarázhatja
Természetesen minden alap megvan. Azonban [quote]A session adatok lemezre irasat a PHP nem a $_SESSION szuperglobal-ba iraskor vegzi, hanem a script futasanak a vegen.[quote] egy lehetséges probléma.
Picit módosítottam a kódon, beraktam egy 1 mp-s késleltetést, úgy tűnik így nem hibázik. (Vagyis hibázik egy helyen, de ott megint csak az általad vázolt probléma lehet a ludas. egyszerre több alkalommal hívok meg egy php-t ami sessionba számokat ment, van amelyik hibázik, és van amelyik nem. chaptát csinálok... )
Azt hiszem, módosítok a kódon, hogy biztosan ne akadjon össze a futás.
Köszönöm.
Egyébiránt tudsz olyan korlátozásról, hogy csak x db ajax lekérés futhat egyszerre?
Egyébiránt tudsz olyan
A Browserscope oldalon nézd meg a Connections per Hostname oszlopot, de a legjobb, ha azonos domén névre maximum csak 2 párhuzamos kérést intézel.
Ez a race condition bug,
Az tévedés, hogy a php requestek egymásra indulnak a fenti esetben. A php-nak úgy kell viselkednie, hogy a párhuzamos szálat addig nem indítja el, amíg az eredeti ki nem írta a session-t (praktikusan ez akkor történik, mikor a script véget ér, feltéve, hogy nem volt session_write_close hívás). Erre több tesztet is futtattam annak idején, hacsak azóta vissza nem tért a hiba, akkor így kell lennie.
Azt kéne megnézned, hogy mi a session kezelőd, (ha nem a standard, akkor annak a verziószáma), illetve milyen verziójú php fut nálad.
Illetve futtathatsz tesztet úgy, hogy a main szálba, a végén teszel pl. egy flush()-t és egy sleep(10)-et, ettől biztosan elindul az ajax hívás, mielőtt véget érne a szál. Firebuggal láthatod, hogy melyik folyamat mikor indult. Ha a requestek egymásra indulnak, akkor gáz van, valószínűleg php-t kell frissíteni a szerveren.
OPS!
Session:
Ez van a rendszerbe építve:
igen, nincs lockolas a
update session set locked = 1 where id = $id and locked = 0;
ezutan megnezed az affected_rows-bol, hogy sikerult-e lockolni.
ha igen, akkor mehetsz tovabb, ha nem, akkor sleep(), majd ujraprobalsz(egy ido utan azert timeoutolj...).
Tyrael
Kb. az idok kezdete ota van
http://svn.php.net/viewvc/php/php-src/trunk/ext/session/mod_files.c?revision=9421&view=markup#l90
sajnos a dokumentacioban nem nagyon esik errol emlites (nyitottam neki egy bugreportot: https://bugs.php.net/bug.php?id=55624 ha nagyon nem oldja meg senki, akkor majd kijavitom en).
ha jol emlekszem, akkor nem a memcached, hanem a memcache futott bele ebbe a problemaba:
http://pecl.php.net/package-info.php?package=memcache&version=3.0.4
Tyrael
Nálunk is előfordult párszor
session_write_close();
}
catch (Exception $e) {
print_r($e);
}
Egyszerre annyi AJAX kérés mehet egyébként, amennyit a szerver bír, de az adott munkamenetben a php script rendelkezésre álló memóriájába mindennek be kell férnie, ami alapesetben nyolc mega.
Szebernél a pont
Nagyon köszönöm mindenkinek a segítségét, új területen tisztult a kép!
Tüneti kezelés
Lockolást beépítem.
Sajnos azt a kódrészletet, aminél kiborult a bili, akkor is át kell írnom, mert meghatározhatatlan volt, hogy hány db ajax lekérés indul.
Köszönöm szépen, nagyon jól érzem magam, hogy kicsit tisztult ebben a kép. Persze tudtam, hogy a phpnek van futási ideje, de valahogy nem számoltam, hogy ilyen gondokat okozhat.
Ez a felmerült instabilitás teljesen "felzaklatott" mindig :)
Köszönöm Nektek!